У меня есть скрипт, который выполняет несколько действий в течение более длительного времени. В стандартной ситуации вывод из PHP-скрипта отправляется после полного выполнения этого скрипта. Пользователь может быть разочарован, если мой скрипт будет загружаться очень долгое время без какого-либо ответа.
Предположим, у меня в этом скрипте есть цикл, который будет работать 10 раз. После каждого выполнения я хочу получить вывод в браузер "Element X finished. Y time."
, Значение X и Y будет меняться.
Есть ли способ достичь этого эффекта? Может быть, с каким-то вызовом от этого скрипта к новому скрипту, который отправит данные в браузер через AJAX.
Или есть ли способ достичь этого эффекта только с помощью PHP-реализации?
Я вижу, что я должен прояснить этот вопрос. Я хочу, чтобы эта информация отображалась динамически на странице. Я уже пробовал с функциями выходного буфера, и он по-прежнему не работает, поскольку мне это нужно. Вывод в браузере отображается после полного выполнения скрипта. Тестовый код:
for ($i = 0; $i <= 10; $i++) { ob_start(); echo "Output " . $i . "<br />"; ob_flush(); //also only flush() etc. sleep(1); }
Да, он должен быть доступен только с PHP. Я помню, что видел некоторый код, связанный с этим, когда я просматривал WordPress некоторое время назад, когда он обновляет модули, он должен загружать файлы ftp, распаковать, копировать файлы и т. Д., Что занимает много времени, и ему нравится обновлять пользователя с помощью что он делает в данный момент … после проверки функции send_message () и чтения страницы PHP ob_flush () , я думаю, что вы хотите:
echo "stuff\n"; // adding a newline may be important here, // a lot of io routines use some variant of get_line() ob_end_flush(); // to get php's internal buffers out into the operating system flush(); // to tell the operating system to flush it's buffers to the user.
Люди из руководства php также подразумевали, что он может помочь явно установить заголовок () с типом mime-типа и символом, установленным в нем, поэтому браузер будет знать это в начале и не будет ждать, пока весь двоичный объект не будет становятся доступными, прежде чем пытаться дешифровать, какой тип сущности он имел.
Если это не сработает, вам нужно будет дополнительно модифицировать вашу систему php.ini, чтобы отключить буферизацию и сжатие вывода, и в этот момент вы также можете взглянуть на решение ajax.
Решение ajax будет выглядеть примерно так:
Ваш скрипт выталкивает некоторый html / javascript для запроса ajax, сбрасывает все его буферы и останавливается относительно себя с пользователем, затем запускает какую-то операцию или, возможно, просто указывает, что какая-то большая операция начинается в базе данных где-то для cron работу, чтобы забрать. В javascript на вашей странице будет цикл таймера для опроса конечной точки ajax для статуса, пока ajax не ответит, что он был завершен. Конечная точка ajax проверит состояние вашей задачи, запросив базу данных или проверив выходные файлы и т. Д., И выплюнет все, что она узнает сразу, и прекратит работу, позволяя клиенту решить, когда спросить его, если все было сделано снова. Это гораздо более сложная и сложная задача с более подвижными частями, но для пользователя достигается очень приятный конечный продукт, если стоит потратить время на изготовление.
Вызов flush();
сразу после выхода кода "Element X finished. Y time."
По умолчанию PHP будет хранить весь вывод в выходном буфере, пока он не будет готов к отправке в браузер. flush()
и ob_flush()
для отправки.
Попробуйте вызвать в каждом цикле ob_flush и ob_clean . Первый отправляет выходной буфер, а второй удаляет его.