PHP отображает сообщения о прогрессе на лету - PullRequest
3 голосов
/ 10 июня 2010

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

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

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

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

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

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

Спасибо!

Ответы [ 6 ]

5 голосов
/ 10 июня 2010

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

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

UPDATE

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

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

1 голос
/ 10 июня 2010

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

1 голос
/ 10 июня 2010

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

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

1 голос
/ 10 июня 2010

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

0 голосов
/ 07 марта 2013

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

0 голосов
/ 10 июня 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...