Эхо-сообщения во время выполнения скрипта php
У меня есть php-скрипт, который использует cURL и занимает около 10-15 минут для выполнения. Что он делает, он анализирует около 1000 страниц, ища конкретные совпадения, и по всему сценарию у меня есть диагностические сообщения, Эхо, такие как "переход на следующую страницу", "найдено совпадение", "ошибка загрузки страницы" ... Как это работает сейчас (и как это нормально), он выполняется в течение 10 минут, а затем выплевывает все мои пользовательские сообщения. Я хотел бы иметь возможность отображать эти сообщения, как они произойдет, но не тогда, когда скрипт будет выполнен. Я думал, что что-то вроде AJAX сделает это, но не уверен, как это будет работать. Любые советы очень ценятся. Спасибо.
9 ответов
Итак, это старый пост, но я нашел решение для этого. Поскольку я также должен сделать то же самое, вывод, когда скрипт все еще работает. Никакой ответ отсюда не помог. Прежде всего, я использую Win32 server(production) и 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 секунду. В противном случае сценарий будет работать слишком быстро, и мы не можем знать, достигли ли мы цели. Надеюсь, это поможет !
вы можете создать промежуточную таблицу.
PHP-скрипт может вместо Эхо-сообщения хранить их в таблице базы данных (возможно, таблица памяти для производительности).
затем вы можете периодически опрашивать отдельный PHP-скрипт с помощью ajax, который будет запрашивать таблицу и возвращать любые новые сообщения клиенту.
использовать flush
немедленно отправить вывод в браузер, путем промывки буфером вывода.
echo "foo";
flush();
echo "bar";
flush();
на самом деле вы ищете что-то вроде flush и помощью ob_flush, однако, иметь в виду, что есть много факторов, которые могут предотвратить свой выход из плотного, что, как это происходит.
с flush документация вы получите:
несколько серверов, особенно на Win32, по-прежнему будут буферизировать вывод из вашего скрипта, пока он не завершится перед передачей результатов в браузер.
серверные модули для Apache, такие как mod_gzip, могут выполнять буферизацию самостоятельно, что приведет к тому, что flush() не приведет к немедленной отправке данных клиенту.
я использую @ob_flush()
после echo
. В этом примере PHP_EOL
создает новую строку после $string
function output($string){
echo $string.PHP_EOL;
@ob_flush();
}
в основном, ваш скрипт записывает вывод HTML во временный файл журнала. Затем используйте ajax для периодического обновления браузера конечного пользователя временным файлом журнала. jQuery быстро справится с этим.
Ajax-единственный гарантированный способ заставить его работать во всех браузерах. Вот цитата из флеш-страницы PHP.
flush ()возможно, не удастся переопределить схема буферизации вашего web сервер и он не имеет никакого влияния на любой клиентский буферизация в браузере. Это также не влияет на пользовательское пространство PHP механизм буферизации вывода. Это средство вам придется вызвать оба ob_flush() и flush() для промывки вывода ob буферы, если вы их используете.
звучит так, как будто у вас есть буферизация вывода включен.
вызов ob_end_flush () напечатает то, что в настоящее время находится в буфере, и выключит буфер для остальной части выполнения скрипта.
вы можете использовать функцию flush () для отправки всего содержимого буфера клиенту. http://php.net/manual/fr/function.flush.php
вы можете использовать оба 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