Эхо-сообщения во время выполнения php-скрипта - PullRequest
9 голосов
/ 12 января 2011

У меня есть php-скрипт, который использует cURL и занимает около 10-15 минут. Что он делает, он анализирует около 1000 страниц в поисках конкретных совпадений, и во всем скрипте у меня выводятся диагностические сообщения, такие как «Переход на следующую страницу», «Найдено совпадение», «Ошибка загрузки страницы» ... То, как это работает сейчас (и то, как это нормально), это то, что он выполняется в течение примерно 10 минут и только потом выплевывает все мои пользовательские сообщения. Я хотел бы иметь возможность отображать эти сообщения, как они происходят, а не после завершения выполнения сценария. Я думал, что-то вроде AJAX сделает это, но я не уверен, как это будет работать. Любые советы с благодарностью. Благодарю.

Ответы [ 9 ]

10 голосов
/ 23 мая 2012

Итак, это старый пост, но я нашел решение для этого.Так же я должен сделать то же самое, выводить, когда скрипт еще работает.Здесь не помог ни один ответ.Прежде всего, я использую сервер Win32 (производство) и XAMPP в качестве локального для тестов.Этот пример является просто подтверждением концепции и может быть изменен по вашему усмотрению.

<?php 
ob_implicit_flush(true);
for($i=1; $i<=10; $i++){
echo "$i ...<br>";
for($k = 0; $k < 40000; $k++) echo ' ';
sleep(1);
}
?>

Итак, мы открываем буфер вывода как неявный.Затем мы создаем демонстрационный цикл для подсчета от 1 до 10 и отображения значений по мере их обработки.Второй цикл заполнит буфер браузера.И, наконец, чтобы проверить, все ли работает хорошо, мы засыпаем на 1 секунду.В противном случае скрипт будет работать слишком быстро, и мы не сможем узнать, достигли ли мы цели.Надеюсь, это поможет!

7 голосов
/ 12 января 2011

Вы можете создать промежуточный стол.

Сценарий PHP может вместо вывода сообщения сохранять их в таблице базы данных (возможно, в таблице памяти для повышения производительности).

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

6 голосов
/ 12 января 2011

Используйте flush для немедленной отправки вывода в браузер путем очистки буфера вывода.

echo "foo";
flush();
echo "bar";
flush();
3 голосов
/ 12 января 2011

На самом деле вы ищете что-то вроде flush и ob_flush , однако имейте в виду, что существует множество факторов, которые могут помешать вашему выводу быть сброшенным, так какслучается.

Из документации flush вы получите:

Несколько серверов, особенно на Win32, все еще будут буферизовать вывод из вашего скрипта, пока он не завершитсяперед передачей результатов в браузер.

Серверные модули для Apache, такие как mod_gzip, могут выполнять собственную буферизацию, что приведет к тому, что flush () не приведет к немедленной отправке данных клиенту.

1 голос
/ 20 февраля 2016

Я использую @ob_flush() после каждого echo.В этом примере PHP_EOL создает новую строку после $string

function output($string){
    echo $string.PHP_EOL;
    @ob_flush();
}
0 голосов
/ 17 ноября 2015

Вы можете использовать как flush, так и ob_flush, напоминая, чтобы установить заголовок типа контента:

<?php
header( 'Content-type: text/html; charset=utf-8' );
for( $i = 0 ; $i < 10 ; $i++ ){
    echo $i . '<br>';
    flush();
    ob_flush();
    sleep(1);
}

Источник: dermeister заметка на php.net ob_flush страница.

Протестировано на Firefox 42.0 и Chrome 46.0

0 голосов
/ 12 января 2011

Вы можете использовать функцию flush () для отправки всего содержимого буфера клиенту.http://php.net/manual/fr/function.flush.php

0 голосов
/ 12 января 2011

Звучит так, как будто у вас включена буферизация вывода .

Вызов ob_end_flush () напечатает то, что в данный момент находится в буфере, и отключит буфер для остальной части выполнения скрипта.

0 голосов
/ 12 января 2011

По сути, ваш скрипт записывает вывод HTML во временный файл журнала.Затем используйте ajax для периодического обновления браузера конечного пользователя временным файлом журнала.jQuery быстро справится с этой задачей.

Ajax - единственный гарантированный способ заставить его работать во всех браузерах.Вот цитата со страницы сброса PHP.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...