#php #cakephp #stream #cakephp-3.x
#php #cakephp #поток #cakephp-3.x
Вопрос:
У меня есть некоторая длительная обработка в цикле, и я хочу выводить прогресс последовательно.
while (true)
{
$percents = $do_my_stuff();
echo $percents;
$this->log($percents);
}
Я перепробовал много методов, но все еще безуспешно
ini_set('output_buffering', 'off');
ini_set('zlib.output_compression', false);
while (@ob_end_flush());
ini_set('implicit_flush', true);
ob_implicit_flush(true);
flush()
в каждом цикле
завершите цикл в
$this->response->body(function () { /* loop with echo here */ }
но все равно браузер отображает все данные один раз, когда скрипт завершен. Заголовки ответов:
HTTP/1.1 200 OK
Host: localhost:8765
Connection: close
X-Powered-By: PHP/5.6.20
Content-type: text/html; charset=UTF-8
PHP 5.6, использование встроенного сервера ./bin/cake server
, CakePHP 3
Как я могу это сделать? Я хочу, чтобы мои пользователи видели проценты работы, потому что она может выполняться в течение длительного времени.
Ответ №1:
Невозможно принудительно отобразить непрерывный вывод в браузере. Некоторые браузеры не будут отображаться до тех пор, пока не получат закрывающий </html>
тег. Таким образом, чтобы убедиться, что вывод работает, вам нужно использовать сетевой монитор, чтобы увидеть, передает ли сервер потоковые данные.
Кроме того, не используйте объект ответа из Cake. Это используется для буферизации выходных данных и их обработки событиями перед отправкой клиенту. Вам нужно будет вручную отправить данные и завершить ответ.
header("Content-Type: text/plain");
while (@ob_end_flush()); // Flush and disable output buffers
for($a = 0; $a < 100; $a ) {
echo "X";
flush(); // Flush output
sleep(1);
}
die; // end request here.
Если вы хотите показать индикатор выполнения на стороне клиента для длительной задачи. Это не тот способ, которым нужно это делать.
Вы должны записать прогресс в сеанс, сохранить его, а затем запросить через AJAX, что это за прогресс.
Комментарии:
1. Спасибо. Я хочу показать вывод консоли из длительно выполняемой консольной задачи, поэтому в целом это «прогресс», а не индикатор выполнения. Теперь я закончил с записью вывода в файл и чтением содержимого файла через AJAX, но я не доволен таким решением.
2. @Yaroslav вы могли бы попробовать использовать
passthru
для потоковой передачи хвост файла журнала. Вот суть: gist.github.com/lorenzos/5cbf78a4447e1a98b59f