Когда бесконечные циклы, полезны в PHP?

C# оперативный алгоритм. Любая предварительная обработка, как нечувствительность к регистру или лишение пробела и пунктуации должна быть сделана прежде, чем передать этой функции.

boolean IsPalindrome(string s) {
    for (int i = 0; i < s.Length / 2; i++)
    {
        if (s[i] != s[s.Length - 1 - i]) return false;
    }
    return true;
}
<час>

Редактирование: удалил ненужный" +1" в условии цикла и потратил сохраненное сравнение на удаление избыточного сравнения Длины. Благодаря комментаторам!

7
задан Charles 23 December 2012 в 21:49
поделиться

11 ответов

Мониторинг приложений

Если у вас есть фоновый процесс, который отслеживает состояние ваших серверов и отправляет электронное письмо в случае возникновения проблем. У него был бы бесконечный цикл для повторяющейся проверки серверов (с некоторой паузой между итерациями).

Сервер прослушивает клиентов

Если у вас есть серверный сценарий, который прослушивает сокет для соединений, он будет бесконечно зацикливаться, блокируя время ожидание подключения новых клиентов.

Видеоигры

В играх обычно есть «игровой цикл», который запускается один раз за кадр, бесконечно.

Или ... что-либо еще, что должно работать в фоновом режиме с периодической чеки.

15
ответ дан 6 December 2019 в 06:24
поделиться

Если вы реализовали сокет-сервер (взято из: http://devzone.zend.com/article/1086 ):

    #!/usr/local/bin/php –q

<?php
// Set time limit to indefinite execution
set_time_limit (0);

// Set the ip and port we will listen on
$address = '192.168.0.100';
$port = 9000;
$max_clients = 10;

// Array that will hold client information
$clients = Array();

// Create a TCP Stream socket
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
// Bind the socket to an address/port
socket_bind($sock, $address, $port) or die('Could not bind to address');
// Start listening for connections
socket_listen($sock);

// Loop continuously
while (true) {
    // Setup clients listen socket for reading
    $read[0] = $sock;
    for ($i = 0; $i < $max_clients; $i++)
    {
        if ($client[$i]['sock']  != null)
            $read[$i + 1] = $client[$i]['sock'] ;
    }
    // Set up a blocking call to socket_select()
    $ready = socket_select($read,null,null,null);
    /* if a new connection is being made add it to the client array */
    if (in_array($sock, $read)) {
        for ($i = 0; $i < $max_clients; $i++)
        {
            if ($client[$i]['sock'] == null) {
                $client[$i]['sock'] = socket_accept($sock);
                break;
            }
            elseif ($i == $max_clients - 1)
                print ("too many clients")
        }
        if (--$ready <= 0)
            continue;
    } // end if in_array

    // If a client is trying to write - handle it now
    for ($i = 0; $i < $max_clients; $i++) // for each client
    {
        if (in_array($client[$i]['sock'] , $read))
        {
            $input = socket_read($client[$i]['sock'] , 1024);
            if ($input == null) {
                // Zero length string meaning disconnected
                unset($client[$i]);
            }
            $n = trim($input);
            if ($input == 'exit') {
                // requested disconnect
                socket_close($client[$i]['sock']);
            } elseif ($input) {
                // strip white spaces and write back to user
                $output = ereg_replace("[ \t\n\r]","",$input).chr(0);
                socket_write($client[$i]['sock'],$output);
            }
        } else {
            // Close the socket
            socket_close($client[$i]['sock']);
            unset($client[$i]);
        }
    }
} // end while
// Close the master sockets
socket_close($sock);
?> 
5
ответ дан 6 December 2019 в 06:24
поделиться

Я пока не соглашусь с другими ответами и предполагаю, что, если вы будете осторожны с вещами, им никогда не будет места.

Всегда есть какое-то условие в котором вы хотите завершить работу, поэтому, по крайней мере, это должно быть while ( проверка, если выключение не запрошено ) или while ( все еще может нормально работать )

I Думаю, на практике бывают случаи, когда люди не используют условие и полагаются на такие вещи, как sigint to php для завершения, но, на мой взгляд, это не лучшая практика, даже если она работает.

Риск размещения теста внутри цикл и прерывание в случае сбоя заключается в том, что это упрощает изменение кода в будущем, чтобы непреднамеренно создать бесконечный цикл. Например, вы можете обернуть содержимое цикла while внутри другого цикла,

2
ответ дан 6 December 2019 в 06:24
поделиться

Может быть, это полезно при написании PHP-приложения для командной строки? Потому что, когда PHP-скрипты запускаются веб-сервером (Apache или любым другим), время их жизни по умолчанию ограничено 30 секундами (или вы можете вручную изменить это ограничение в файле конфигурации).

3
ответ дан 6 December 2019 в 06:24
поделиться

Бесконечные циклы особенно полезны при создании приложений командной строки. Затем приложение будет работать, пока пользователь не скажет ему остановиться. (добавьте оператор break / exit, например, когда пользовательский ввод "quit")

while (true) {
  $input = read_input_from_stdin();

  do_something_with_input();

  if ($input == 'quit') {
    exit(0);
  }
}
1
ответ дан 6 December 2019 в 06:24
поделиться

Я думаю об игре «угадай число», в которой пользователь должен угадать случайно (или нет) сгенерированное число, поэтому ему придется вводить числа, пока он не получит его. Это то, что вам нужно?

0
ответ дан 6 December 2019 в 06:24
поделиться

Для ввода пользователем .. .

while True:
    input = get_input_from_user("Do you want to continue? ")
    if input not in ("yes", "y", "no", "n"):
        print "invalid input!"
    else: 
        break
0
ответ дан 6 December 2019 в 06:24
поделиться

Infinite loops are one of those tools you keep in a separate toolbox that doesn't get opened much as it is a tool of (almost) last resort.

The best use I have found for them is with state machines or loops that are approaching state machines. This is because the exit condition is usually quite complex and cannot be put at the top or the bottom of the loop.

0
ответ дан 6 December 2019 в 06:24
поделиться

Я думаю, что упускается один момент ... на самом деле нет бесконечных циклов (вы бы застряли в них навсегда), скорее while (правда) {...} и co полезны, когда у вас есть нетривиальные условия выхода (например, те, которые поступают из сторонней библиотеки, или ограничение, вычисление которого потребует много времени, но может быть установлено постепенно внутри цикла, или что-то еще полагаясь на вводимые пользователем данные).

Неудивительно, что не каждый цикл можно кратко описать как для , , а или делают цикл без используя перерыв .

0
ответ дан 6 December 2019 в 06:24
поделиться

Иногда вместо цикла, у которого условие выхода будет слишком длинным для сохранения читабельности, неправильно назван "бесконечным" циклом может быть лучшим путем.

<?php

while(1) {
  // ... 
  $ok=preg_match_all('/.../',$M,PREG_SET_ORDER);
  if (!$ok) break;

  switch(...) { ... }

  // match another pattern
  $ok=preg_match('/.../',$M,PREG_SET_ORDER);
  if (!$ok) break;

  //and on, and on...
}
0
ответ дан 6 December 2019 в 06:24
поделиться

Пол Биггар опубликовал сценарий make для проектов LaTeX , который использует бесконечный цикл для работы в фоновом режиме и постоянно пытается восстановить исходные коды LaTeX.

Единственный способ завершить сценарий - убить его извне (например, с помощью Ctrl + C ).

(Конечно, не PHP (на самом деле Bash), но тот же сценарий вполне может быть вместо этого реализован в PHP.)

0
ответ дан 6 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: