2009-07-25 12 views
7

Chciałbym móc zezwolić użytkownikowi na przeglądanie wyników długotrwałego skryptu GCI, ponieważ jest on generowany, a nie po zakończeniu skryptu. Jednak nawet po wyraźnym opróżnieniu STDOUT serwer wydaje się czekać na zakończenie skryptu przed wysłaniem odpowiedzi do klienta. Jest to na serwerze Linux z uruchomionym Apache 2.2.9.Jak mogę obsługiwać niebuforowane treści CGI z Apache 2?

Przykład pyton CGI:

#!/usr/bin/python 

import time 
import sys 


print "Content-type: text/plain" 
print 
for i in range(1, 10): 
     print i 
     sys.stdout.flush() 
     time.sleep(1) 

print "Done." 

Podobny przykład w Perlu:

#!/usr/bin/perl 

print "Content-type: text/plain\n\n"; 

for ($i = 1; $i <= 10 ; $i++) { 
     print "$i\n"; 
     sleep(1); 
} 

print "Done."; 

Ten link mówi jak Apache 1.3 CGI wyjścia powinny być buforowane (ale to może mieć zastosowanie tylko do Apache 1.x): http://httpd.apache.org/docs/1.3/misc/FAQ-F.html#nph-scripts

Wszelkie pomysły?

+1

Możesz również potencjalnie być uruchomiony do klienta (przeglądarki) -side kwestie buforujące. – Miles

Odpowiedz

4

Randal Schwartz Watching long processes through CGI wyjaśnia inny (i IMHO, lepiej) sposób oglądania długiego procesu.

+0

Skończyło się na użyciu podobnej metody dla mojej aplikacji, ale wciąż jestem ciekawy, dlaczego oryginalna metoda nie działa w mojej konfiguracji. No cóż. –

1

Według CGI::Push,

Apache serwer WWW z wersji 1.3b2 na nie potrzebne skrypty Push serwera zainstalowane jako skrypty NPH: the -nph parametr do do_push() może być ustawiony na false wartość, aby wyłączyć dodatkowe nagłówki wymagane przez skrypt NPH.

Trzeba tylko znaleźć odpowiednik do_push w python.

Edytuj: Spójrz na CherryPy: Streaming the response body.

Po ustawieniu wejścia config "response.stream" True (i użyć "wydajność") CherryPy zarządza rozmowy między serwerem HTTP i kodu tak:

alt text http://www.cherrypy.org/attachment/wiki/ReturnVsYield/cpyield.gif?format=raw

1

Flushing STDOUT może pomóc. Na przykład, poniższy program Perl powinien działać zgodnie z przeznaczeniem: artykuł

#!/usr/bin/perl 

use strict; 
use warnings; 

local $| = 1; 

print "Content-type: text/plain\n\n"; 

for (my $i = 1 ; $i <= 10 ; $i++) { 
    print "$i\n"; 
    sleep(1); 
} 

print "Done."; 
2

musi umieścić swój skrypt włożyć do specjalnego katalogu wich zawierać specjalną .htaccess z tym Environnement Specyfikacja:

Options +ExecCGI 
AddHandler cgi-script .cgi .sh .pl .py 
SetEnvIfNoCase Content-Type \ 
"^multipart/form-data;" "MODSEC_NOPOSTBUFFERING=Do not buffer file uploads" 
SetEnv no-gzip dont-vary 
+0

Awans do "setenv no-gzip". Dziękuję Ci! –