2015-01-09 2 views
0

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

Я создал веб-приложение, которое запускает обширную процедуру обработки данных в PHP (т. Е. Запросы MySQL, вычисления и т. Д.).

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

Однако есть проблема. Кажется, я не могу контролировать время выполнения сценария, пока скрипт вызывается через cgi.

Когда я запускаю скрипт через SSH, а в командной строке он отлично работает, как долго он обрабатывает данные.

Но если я использую команду exec() в скрипте php, вызываемом через веб-сервер, я всегда получаю ошибку End of script output before headers примерно через 45 секунд.

Вместо того, чтобы возиться с настройками сервера (кошмар с точки зрения переносимости), я хотел бы найти решение, которое запускает скрипт независимо от cgi.

Любые предложения?

+0

"независимо от cgi." так mod_php? –

+0

Да, но нет. Это хостинг-решение с ограниченным доступом к конфигурации сервера. Так что я должен найти решение, которое работает, когда 'mod_fastcgi' по умолчанию – Tomm

+0

вы можете показать нам php-код? и проверили ли вы какую-либо другую команду exec(), которая не требует много времени для выполнения, работает ли она? только лимит времени является препятствием? – Alex

ответ

2

Не выполняйте длинный скрипт непосредственно с веб-сайта (AKA, непосредственно из Apache), потому что, как вы уже упоминали, он будет блокироваться до тех пор, пока он не закончится и, возможно, не закончится. Вместо этого используйте веб-сайт для планирования задания (выполнения длинного скрипта), которое будет запущено немедленно.

Вот основная схема того, как вы потенциально можете сделать это:

  1. Создать новые, небольшую базу данных для хранения запросов рабочих мест, в том числе полого job_id, processing_status, run_start_time и более соответствующих областей
  2. Создать некоторый Ajax, который попадает на ваш сервер и записывает «запрос на задание» в эту базу данных заданий, установленную для немедленного выполнения.
  3. Добавьте скрипт crontab или бот, который периодически следит за новыми заданиями. Если он найдет задание, которое еще предстоит обработать, но прошло run_start_time, запустите его, используя exec() или какой-либо другой исполнитель команды. Таким образом, команда не будет таймаутом, потому что она не запускается Apache, а демоном cron.
  4. Когда команда завершается, обновите базу данных заданий, указав, что обработка завершена.
  5. На своем веб-сайте напишите интерфейс, который позволяет пользователю увидеть, завершено ли задание. Как только он заканчивается, он отображает какой-то индикатор «Готово» или что-то подобное.