Можно ли распечатать результат во время цикла мгновенно без JavaScript? - PullRequest
1 голос
/ 02 марта 2011

Вот пример кода, который я ожидаю напечатать сообщение каждую секунду.

set_time_limit(0);

foreach($array as $key => $value)
{
    echo $value;

    sleep(1);
}

Мне интересно, можно ли выводить результаты во время каждого шага в цикле мгновенно, не дожидаясь его остановки.

Ответы [ 2 ]

2 голосов
/ 02 марта 2011

да. Вы можете сделать это используя механизм сброса php.

например:

   <?
    ob_implicit_flush(true);
    foreach($array as $key => $value)
{
    echo $value;

    sleep(1);
}
    ?>
1 голос
/ 02 марта 2011

Это на самом деле невозможно, поскольку веб-сервер кэширует результат. Клиент может получать новые данные, когда кэш вывода заполняется и отправляет новый http-пакет, но делать это так не рекомендуется, поскольку сценарии php также прерывают время ожидания, поэтому результаты такого подхода могут быть неоднозначными.

Edit: вы можете очистить кэш php используя php's ob_flush , как в ob_flush();. Однако это по-прежнему оставляет проблему в том, что сценарий может прерваться, поэтому вы не можете продолжать делать это в течение очень долгого времени.

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

Редактировать 2: Для WebSockets это не так уж и мало, чтобы опубликовать здесь. Кроме того, он работает только в HTTP5, Chrome 8 поддерживает его и, возможно, Firefox 4 и Safari 5. Вот руководство по использованию Websockets с PHP: WebSockets с PHP

...