PHP отображает сообщения о прогрессе на лету

Я работаю в инструменте на PHP, который обрабатывает много данных и занимает некоторое время, чтобы закончить. Я бы хотел, чтобы пользователь обновлялся с тем, что происходит, и обрабатывается текущая задача.

Что, на ваш взгляд, лучший способ сделать это? У меня есть некоторые идеи, но я не могу принять решение о наиболее эффективном:

  • Старый способ: выполнить небольшую часть скрипта и отобразить страницу пользователю с помощью Meta Redirect или таймера JavaScript, чтобы отправить запрос на продолжение сценария (например, /script.php?step=2 ).

  • Отправка AJAX постоянно запрашивает файл сервера, который PHP продолжает обновлять через fwrite ().

  • То же, что и выше, но PHP обновляет поле в базе данных вместо сохранения файла.

Кто-нибудь из них звучит хорошо? Есть идеи?

Благодаря!

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

Что касается реализации этого сценария «прогресса», я мог бы предложить больше советов, если бы у меня было больше информации о том, что вы подразумеваете под «обрабатывает много данных». Если вы пишете файл, ваш сценарий «прогресс» может просто проверить размер файла и вернуть процент завершения. Для более сложных задач вы можете назначить контрольные значения для определенных процессов и вернуть оценочный процентный коэффициент, основанный на том, какой процесс завершился последним или в настоящее время работает.

ОБНОВИТЬ

Это один из предложенных способов «проверить прогресс» активного скрипта, который просто ждет ответа от запроса. У меня есть приложение для интеллектуального анализа данных, для которого я использую аналогичный метод.

В вашем скрипте, который делает запрос, которого вы ожидаете (сценарий, который вы хотите проверить), вы можете сохранить (либо в файле, либо в базе данных, я использую базу данных, поскольку у меня есть сотни процессов, запущенных в любое время которые все должны отслеживать их прогресс, и у меня есть другой скрипт, который позволяет мне отслеживать ход этих процессов) переменную прогресса для процесса. Когда процесс начинается, установите это значение 1. Вы можете легко выбрать произвольное количество «контрольных точек», которые должен пройти сценарий, и рассчитать процент от текущей контрольной точки. Однако для большого запроса вы можете быть более заинтересованы в том, чтобы узнать приблизительный процент запроса. Одним из возможных решений было бы узнать размер возвращаемого контента и установить переменную статуса в соответствии с полученным в любой момент процентом. Т.е. если вы получите данные запроса в цикле, на каждой итерации вы можете обновить статус. Или, если вы загружаете в плоский файл, вы можете опросить размер файла. Это можно сделать менее точно со временем (а не размером с файлом), если вам известно приблизительное время, которое должен выполнить запрос, и просто сравнить его с текущим временем выполнения скрипта. Очевидно, ни одно из них не является идеальным решением, но я надеюсь, что они дадут вам некоторое представление о ваших вариантах.

Я предлагаю использовать метод AJAX, но не используя файл или базу данных. Вероятно, вы можете использовать значения сеанса или что-то в этом роде, таким образом вам не нужно создавать соединение или открывать файл, чтобы что-либо сделать.

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

Лично мне нравится ваш второй вариант. Должна быть надежной и довольно простой в реализации.

Мне нравится вариант 2 – использование AJAX для чтения файла состояния, который PHP периодически пишет. Это открывает множество различных вариантов презентации. Если вы пишете объект JSON в файл, вы можете легко разобрать его и отобразить такие вещи, как индикатор выполнения, сообщения о статусе и т. Д. …

«Грязный», но быстрый и простой подход – просто откликнуться на статус, когда скрипт работает. Пока у вас нет буферизации вывода, браузер будет отображать HTML, когда он получает его с сервера (я знаю, что WordPress использует этот метод для автоматического обновления).

Но да, «лучший» подход был бы AJAX, хотя я бы не сказал, что что-то не так с «разрывом» использует переадресацию.

Почему бы не включить 1 и 2, где AJAX отправляет запрос на script.php?step=1 , проверяет ответ, записывает в браузер, а затем возвращается больше на script.php?step=2 и так далее?

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