Выполнение серверного исполнения PHP-скрипта через веб-страницу

0

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

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

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

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

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

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

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

Какие-либо предложения?

  • 0
    "независимо от CGI." так mod_php?
  • 0
    Да, но нет Это размещенное решение с ограниченным доступом к конфигурации сервера. Поэтому я должен найти решение, которое работает, когда mod_fastcgi по умолчанию
Показать ещё 7 комментариев
Теги:

1 ответ

2

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню