У меня есть скрипт php, который использует cURL и занимает около 10-15 минут для выполнения. Что он делает, он анализирует около 1000 страниц, которые ищут конкретные совпадения, и на протяжении всего сценария у меня появляются диагностические сообщения, например «Переход на следующую страницу», «Найдено совпадение», «Ошибка загрузки страницы» ... как это работает сейчас (и так, как это обычно бывает), он выполняется как 10 минут и только затем выплевывает все мои пользовательские сообщения. Я хотел бы иметь возможность отображать эти сообщения, как они есть, а не когда скрипт выполняется. Я думал о чем-то вроде AJAX, но не знаю, как это будет работать. Любые советы приветствуются. Благодарю.Эхо-сообщения, пока скрипт php все еще выполняется
ответ
Итак, это старый пост, но я нашел решение для этого. Поскольку мне также нужно сделать то же самое, выведите, когда скрипт все еще работает. Ни один ответ отсюда не помог. Прежде всего, я использую сервер 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 секунды. В противном случае скрипт будет работать слишком быстро, и мы не могли бы знать, достигли ли мы цели. Надеюсь, это поможет!
Используйте flush
для немедленной отправки вывода в браузер путем сброса выходного буфера.
echo "foo";
flush();
echo "bar";
flush();
Flush не гарантирует работу во всех браузерах/платформах/конфигурациях – mrbinky3000
Вы можете создать промежуточный стол.
Сценарий PHP вместо echo'ing сообщения хранит их в таблице базы данных (возможно, в таблице памяти для производительности).
Затем вы можете периодически опросить отдельный скрипт PHP с помощью ajax, который будет запрашивать таблицу и возвращать новые сообщения клиенту.
Согласен. Flush не будет работать в 100% случаев. Ajax необходим. – mrbinky3000
Нет ли толкающего решения (вместо опроса)? – Richard
Как правило, ваш сценарий записывает выходные данные HTML во временный файл журнала. Затем используйте ajax для периодического обновления браузера конечного пользователя временным файлом журнала. jQuery быстро справится с этим.
Ajax - единственный гарантированный способ заставить его работать во всех браузерах. Вот цитата из флеш-страницы PHP.
заподлицо() не может иметь преимущественную схему буферизации вашего сервера веб- и это не имеет никакого эффекта на любой стороне клиента буферизации в браузере. Он также не влияет на пользовательское пространство PHP механизм буферизации вывода. Это означает, что вам нужно будет вызвать оба ob_flush() и flush(), чтобы очистить вывод OB буферов, если вы используете их.
Что делать, если 1000 пользователей будут одновременно получать доступ к странице с разными параметрами? , вам нужно будет написать 1000 файлов, я не вижу этого в качестве опции. –
Вы можете легко создавать временные файлы в PHP. Он в основном такой же, как 1000 пользователей INSERT'ing, в базу данных mysql. Heck, use, mysql. Просто храните журнал где-нибудь и привязывайте его к этой сессии, если более одного человека использует его. У меня такое чувство, что это бэкэнд-скрипт, который будет использоваться одним человеком. – mrbinky3000
У вас есть правильное чувство. Я буду единственным пользователем. – pHelics
Звучит так, как будто у вас есть output buffering включен.
Вызов ob_end_flush() будет распечатывать то, что в данный момент находится в буфере, и отключить буфер для остальной части выполнения скрипта.
На самом деле вы ищете что-то вроде flush и ob_flush, однако имейте в виду, что существует множество факторов, которые могут помешать вашему выходу быть flush'd, как это происходит.
Из документации flush вы получите:
Несколько серверов, особенно на Win32, по-прежнему будет амортизировать выход из вашего скрипта, пока она не завершится до передачи результатов в браузер.
Серверные модули для Apache, такие как mod_gzip, могут выполнять собственную буферизацию, что приведет к тому, что flush() не приведет к немедленному отправке данных клиенту.
Вы сделали хороший момент, пока скрипт не будет выполнен. Я работаю над ним на платформе Win32, а затем поставлю его в unix – pHelics
Вы можете использовать функцию 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
Я использую @ob_flush()
после каждого echo
. В этом примере PHP_EOL
создает новую строку после $string
function output($string){
echo $string.PHP_EOL;
@ob_flush();
}
- 1. Служба Android отключается, пока Runnable все еще выполняется
- 2. Предотвратить задача выполняется снова, пока он все еще работает
- 3. swift func возвращает ноль, пока он все еще выполняется
- 4. Проверьте, все еще запущен скрипт php.
- 5. Откройте новый терминал, пока главный скрипт все еще работает
- 6. PHP-скрипт не выполняется
- 7. PHP - скрипт не выполняется
- 8. PHP-скрипт не выполняется.
- 9. Dealloc вызывается, пока метод все еще запущен
- 10. QProcess: Разрушен, пока процесс все еще запущен
- 11. PHP-файл if-statement все еще выполняется, даже если false
- 12. PHP все еще не выполняется на MAC OSX 10.10 Yosemite
- 13. Как именно выполняется скрипт PHP?
- 14. php cURL скрипт выполняется дважды
- 15. MySQL Query все еще выполняется через день ..?
- 16. Почему эта часть кода все еще выполняется?
- 17. Прокомментированный код все еще выполняется в Xcode
- 18. Почему условие этого цикла все еще выполняется?
- 19. Почему моя страница все еще выполняется?
- 20. «Разрыв» цикла while все еще выполняется внутри?
- 21. Некомпилированный класс java, но все еще выполняется
- 22. Загрузка и распаковка процесса все еще выполняется
- 23. Обнаружить, если задача ThreadPool все еще выполняется
- 24. asp.net MVC: отключено RoleManager все еще выполняется
- 25. Класс освобождается, пока KVO все еще зарегистрирован
- 26. QThread: Разрушен, пока поток все еще запущен
- 27. QWaitCondition: Разрушено, пока потоки все еще ждут
- 28. ajax request возвращает «ошибка 500», скрипт php все еще работает
- 29. Убедитесь, что скрипт python все еще запущен
- 30. flock - скрипт выполнен, но все еще заблокирован
Аналогично [этот вопрос] (http://stackoverflow.com/questions/4481235/php-flush-ob-flush-not-working). – netcoder
Другим простым случаем было бы выполнение сценария из командной строки, так что вы получите эхо в реальном времени. –