2011-01-12 2 views
9

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

+1

Аналогично [этот вопрос] (http://stackoverflow.com/questions/4481235/php-flush-ob-flush-not-working). – netcoder

+0

Другим простым случаем было бы выполнение сценария из командной строки, так что вы получите эхо в реальном времени. –

ответ

9

Итак, это старый пост, но я нашел решение для этого. Поскольку мне также нужно сделать то же самое, выведите, когда скрипт все еще работает. Ни один ответ отсюда не помог. Прежде всего, я использую сервер 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 секунды. В противном случае скрипт будет работать слишком быстро, и мы не могли бы знать, достигли ли мы цели. Надеюсь, это поможет!

6

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

echo "foo"; 
flush(); 
echo "bar"; 
flush(); 
+1

Flush не гарантирует работу во всех браузерах/платформах/конфигурациях – mrbinky3000

7

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

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

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

+0

Согласен. Flush не будет работать в 100% случаев. Ajax необходим. – mrbinky3000

+0

Нет ли толкающего решения (вместо опроса)? – Richard

0

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

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

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

+0

Что делать, если 1000 пользователей будут одновременно получать доступ к странице с разными параметрами? , вам нужно будет написать 1000 файлов, я не вижу этого в качестве опции. –

+0

Вы можете легко создавать временные файлы в PHP. Он в основном такой же, как 1000 пользователей INSERT'ing, в базу данных mysql. Heck, use, mysql. Просто храните журнал где-нибудь и привязывайте его к этой сессии, если более одного человека использует его. У меня такое чувство, что это бэкэнд-скрипт, который будет использоваться одним человеком. – mrbinky3000

+0

У вас есть правильное чувство. Я буду единственным пользователем. – pHelics

0

Звучит так, как будто у вас есть output buffering включен.

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

3

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

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

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

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

+0

Вы сделали хороший момент, пока скрипт не будет выполнен. Я работаю над ним на платформе Win32, а затем поставлю его в unix – pHelics

0

Вы можете использовать как 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

1

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

function output($string){ 
    echo $string.PHP_EOL; 
    @ob_flush(); 
} 
Смежные вопросы