Тайм-ауты Apache 2.2 CGI perl, время ожидания даже при периодической печати - PullRequest
1 голос
/ 11 августа 2010

У меня есть код CGI, который вызывается AJAX из клиентского JavaScript. Однако результат вызова сбрасывается клиентом.

На бэкенде встречается этот код:

$|=1;
my $i = 0;
while (<$fh_echo>)
{
    #To prevent apache timing out the cgi script. 
    print "." if $i % 100 == 0;

    #Do stuff
    $i++;
}

Несмотря на периодическую распечатку, время ожидания истекло:

[warn] [client 10.23.12.87] Timeout waiting for output from CGI script 
[error] [client 10.23.12.87] (70007)The timeout specified has expired: ap_content_length_filter: apr_bucket_read() failed

Мне кажется, тот факт, что javascript отбрасывает вывод, не должен влиять на то, разрешает ли apache продолжать выполнение сценария cgi. Если так, то что здесь происходит?

Ответы [ 2 ]

2 голосов
/ 11 августа 2010

Отключение тайм-аута для сценариев CGI вызывает проблемы. Учитывая, что результат вызова отбрасывается клиентом, вместо этого вы должны fork, чтобы потомок завершил работу, а родитель быстро завершил.

См. Просмотр длинных процессов через CGI для объяснения. В частности,

А теперь самое интересное. Мы собираемся выполнить разветвление, начиная со строки 31. Это позволяет родительскому процессу сообщить Apache, что мы закончили с ответом на этот запрос, и в то же время разрешить дочернему процессу выполнить длинную трассировку. & Hellip;

Дочерний процесс продолжается, но сначала он должен закрыть STDOUT, потому что в противном случае Apache будет думать, что для браузера все еще могут быть какие-то выходные данные, и не будет отвечать браузеру или разорвать соединение, пока все не будет решено.

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

Вывод Perl-буферов, пожалуйста, убедитесь, что для $| установлено ненулевое значение.

Apache истечет время ожидания запроса, если вы не отключите эту функциональность , независимо от того, что-то возвращеноили нет со стороны cgi.

...