Нужно запустить длинный скрипт php из браузера - PullRequest
3 голосов
/ 23 сентября 2010

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

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

Это на Windows Server 2007.

Ответы [ 4 ]

1 голос
/ 23 сентября 2010

В PHP вы должны указать время ожидания для вашего процесса

См. Руководство по PHP set_time_limit ()

У вас может быть другая проблема: тайм-аут самого браузера (может составлять около 1-2 минут). Хотя этот тайм-аут должен быть изменяемым в браузере (для каждого браузера), обычно вы можете предотвратить запуск пользовательской части тайм-аута, отправляя некоторые данные в браузер, например, каждые 20 секунд (например, заголовок для загрузки, вы затем можно отправлять другие заголовки, например, кодирование и т. д.)

1 голос
/ 23 сентября 2010

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

0 голосов
/ 23 сентября 2010

Почему бы вам не сделать ajax-вызов со страницы, на которой вы хотите предложить загрузку, а затем просто подождать, пока не вернется ajax-вызов, а также set_time_limit (0) на другой странице.

0 голосов
/ 23 сентября 2010

Gearman очень удобен для этого (создайте фоновую задачу, пусть javascript опрашивает о прогрессе).Это, конечно, требует, чтобы был установлен gearman и созданы рабочие.Смотри: http://www.php.net/gearman

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