Эхо-сообщения во время выполнения скрипта 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