2010-09-23 2 views
3

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

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

Это на сервере окон 2007.

+0

set_time_limit (0); ignore_user_abort (истина); header ('Местоположение:'. $ _ SERVER ['SCRIPT_NAME']); - Не должно ли это работать теоретически? Кажется, что все еще ждут страницы. Идея здесь заключается в том, чтобы запустить скрипт, но отправить пользователя на предыдущую страницу, чтобы он был уведомлен ajax, когда файл существует. – Chris

+0

Крис Я предполагаю, что это сработает, но это также убьет ваш сервер при высокой нагрузке! – Alfred

+0

Хорошо, теперь у меня есть рабочая форма. Используя set_time_limit (0) и запрос ajax, он будет работать в фоновом режиме. – Chris

ответ

1

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

0

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

+0

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

+0

Лично я устроился и начал от прослушивания до фактического развертывания готового процесса, пригодного для производства (рабочие, рабочие места и все) примерно за час, хотя ваш пробег может отличаться. Это по сути решение @ just_in_case, только с _less_ работает для вас. – Wrikken

0

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

+0

Вы использовали это? Позволит ли он работать до тех пор, пока это необходимо? Потому что это довольно простой вариант, если он это делает. – Chris

1

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

См PHP manual set_time_limit()

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

Смежные вопросы