Как вы запускаете длинный PHP-скрипт и продолжаете отправлять обновления в браузер через HTTP?

Как вы запускаете длинный PHP-скрипт и продолжаете отправлять обновления в браузер через HTTP?

Что-то делать с буферизацией вывода, но я точно не знаю, как это сделать.

Solutions Collecting From Web of "Как вы запускаете длинный PHP-скрипт и продолжаете отправлять обновления в браузер через HTTP?"

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

Затем вы можете использовать ob_flush и flush для продолжения промывки вывода. Например, если вы находитесь в цикле foreach и в конце каждого цикла вы хотите вывести новую строку и подождать 1 секунду, вы можете это сделать.

Но также посмотрите на set_time_limit , потому что иначе люди могут получить таймаут через 30 секунд или около того.

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

Это выглядит так, как вы:

буферизация вывода, PHP отправляет выходные данные ваших скриптов на ваш веб-сервер, как только он будет готов – это может быть строка за строкой или блок кода блоком кода.

Буферизация вывода

Функция ob_start () используется для создания нового выходного буфера, и вы можете сразу начать писать на него, распечатав контент как обычно. После открытия буфера есть два способа закрыть его: ob_end_flush () и ob_end_clean (), оба из которых заканчивают буфер, но делают это несколько иначе. Первый конец буфера и отправляет все данные на вывод, а последний заканчивает буфер, не отправляя его на вывод, эффективно уничтожая любую сохраненную вами информацию. Каждый фрагмент текста, выводимый при открытом буфере вывода, помещается в этот буфер, а не отправляется на вывод. Рассмотрим следующий сценарий:

 <?php ob_start(); print "In first buffer!\n"; ob_end_flush(); ob_start(); print "In second buffer!\n"; ob_end_clean(); ob_start(); print "In third buffer!\n"; ?> 

Этот скрипт выведет «В первом буфере», потому что первый текст помещается в буфер, а затем очищается с помощью ob_end_flush (). Во втором буфере не распечатывается, потому что он помещается в буфер, который очищается с помощью ob_end_clean () и не отправляется на вывод. Наконец, сценарий будет печатать «В третьем буфере», потому что PHP автоматически сбрасывает открытые выходные буферы, когда он достигает конца скрипта.

У вас также может быть своего рода фоновая задача и интерфейс, обеспечивающий вам скорость выполнения.

например, страницу с именем job.php

 <?php for ($i=0; $i<100; ++$i) { store($i); // long stuff sleep(42); } ?> 

и progress.php

 <?php return get($i); ?> 

Затем некоторые ajax обращаются к progress.php? Task = mytaskid и обновляют графический интерфейс. Я видел такой метод для «большой» загрузки файлов и нашел это замечательным.

Изменить: извините, это не отвечает на первоначальный вопрос.

 <?php # try this... for (;;) { echo time() . '<br>'; ob_flush(); # http://php.net/ob_flush flush(); # http://php.net/flush sleep(1); # http://php.net/sleep } ?> 

Я получил обновление страницы, используя простой вывод HTTP, чтобы заставить его работать:

  • Убедитесь, что вы закрываете любые открытые элементы в <body> – иначе он не будет отображаться
  • Вставьте выделенный текст в элемент (например, <p> )
  • Использовать буферизацию и нормальную промывку
  • Протестировано на Firefox 3

Вот мой код:

 for ($nc=0; $nc<10; $nc++){ // delay just to test sleep(1); // send message to browser ob_end_clean(); ob_start(); echo "<p>Update ".$nc."</p>"; ob_end_flush(); flush(); }