Что делать, если у меня есть CGI, который работает в течение нескольких минут перед выводом данных, и Apache тайм-аут его? - PullRequest
1 голос
/ 26 августа 2010

У меня есть CGI-скрипт, выполнение которого занимает очень много времени. Короче говоря, ему нужно обработать много данных, выполнить кучу медленных команд и сделать несколько медленных веб-запросов, в течение которых он ничего не выводит, а когда это сделано, он наконец выводит свои результаты в JSON формат. Запуск занимает несколько минут, что больше, чем указано в директиве Timeout, заданной в httpd.conf моего веб-сервера Apache.

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

Я получаю следующую ошибку в Apache: (70007)The timeout specified has expired: ap_content_length_filter: apr_bucket_read() failed

Что я могу сделать?

Ответы [ 3 ]

1 голос
/ 23 апреля 2011

Я придумала решение.

Я бы начал выводить фиктивный заголовок HTTP, например Dummy: ..., и я мог бы поместить любые данные в качестве значения этого заголовка, и они не будутвлияет на остальную часть продукции.Таким образом, я выводил бы символ к этому фиктивному значению каждую минуту или около того, предотвращая его истечение срокаИ когда я буду готов, я могу напечатать строку возврата и продолжить печать остальных моих (настоящих) HTTP-заголовков и содержимого документа.

1 голос
/ 26 августа 2010

Ну, чтобы предложить глупо простое решение, почему бы просто не заставить скрипт время от времени выводить какой-то результат, пока он работает?Вы можете просто напечатать «Обработка ...» каждые несколько шагов, или, если вы хотите быть более креативным, попросить распечатать некоторые обновления статуса, чтобы указать, что он делает.Или, если вы беспокоитесь о том, что вам надоест, распечатайте смешную поэму за раз.(Вид напоминает мне о http://pages.cs.wisc.edu/~veeve/404.html)

Если вы не хотите этого делать, следующее, что приходит мне в голову, - это использовать асинхронную обработку. По сути, вам придется порождать отдельный процессиз сценария CGI и выполните длительную обработку в этом отдельном процессе. Сам основной сценарий CGI просто выводит простую страницу HTML, которая говорит, что процесс работает, а затем завершается. Эта страница HTML также должна содержать некоторую логику для периодической проверкиПосмотрите, завершился ли фоновый процесс на сервере. Это может быть элемент <meta http-equiv="refresh" ...> HTML или вы можете использовать AJAX.

0 голосов
/ 26 августа 2010

Очень прагматичным подходом может быть запуск фоновой работы и отправка ответа клиенту по электронной почте.1O-1 они предпочли бы это, а не открывать окно браузера весь день.

...