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

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

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

6
задан Robinicks 8 June 2010 в 09:24
поделиться

5 ответов

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

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

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

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

3
ответ дан 16 December 2019 в 21:34
поделиться
<?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
}
?>
1
ответ дан 16 December 2019 в 21:34
поделиться

Это похоже на то, что вам нужно:

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

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

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

<?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 автоматически сбрасывает открытый выходные буферы, когда он достигает конца сценария.

2
ответ дан 16 December 2019 в 21:34
поделиться

Я получил обновление страницы с помощью простого вывода HTTP, чтобы он работал:

  • Убедитесь, что вы закрыли все открытые элементы в - иначе он выиграл 't display
  • Заключить выводимый текст в элемент (например,

    )

  • Использовать буферизацию вывода и обычную очистку
  • Проверено в 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();
}
1
ответ дан 16 December 2019 в 21:34
поделиться

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

например, страница с названием 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 и обновление GUI. Я видел такой метод для загрузки "большого" файла и нашел его отличным.

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

1
ответ дан 16 December 2019 в 21:34
поделиться
Другие вопросы по тегам:

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