2009-07-25 4 views
7

Vorrei poter consentire a un utente di visualizzare l'output di uno script GCI di lunga durata mentre viene generato anziché dopo il completamento dello script. Tuttavia, anche quando spengo esplicitamente STDOUT, il server sembra attendere lo script prima di inviare la risposta al client. Questo è su un server Linux con Apache 2.2.9.Come posso pubblicare un contenuto CGI senza buffer da Apache 2?

Esempio pitone 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." 

esempio simile in Perl:

#!/usr/bin/perl 

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

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

print "Done."; 

Questo link dice come di Apache uscita 1.3 CGI dovrebbe essere unbuffered (ma questo potrebbe applicarsi solo ad Apache 1.x): http://httpd.apache.org/docs/1.3/misc/FAQ-F.html#nph-scripts

Qualche idea?

+1

Si può anche potenzialmente essere in esecuzione in client (browser) problemi di buffering -Spaccati. – Miles

risposta

4

Randal Schwartz Watching long processes through CGI spiega un modo diverso (e secondo me, meglio) di guardare un processo in esecuzione lunga.

+0

Ho finito per utilizzare un metodo simile per la mia applicazione, ma sono ancora curioso di sapere perché il metodo originale non funziona nella mia configurazione. Oh bene. –

1

Secondo CGI::Push,

Apache web server dalla versione 1.3b2 sulla non ha bisogno di script server push installato come script NPH: il -nph parametro do_push() può essere impostata su un valore falso per disabilitare le intestazioni aggiuntive necessarie per uno script NPH.

Devi solo trovare l'equivalente di do_push in python.

Modifica: Dai uno sguardo allo CherryPy: Streaming the response body.

Quando si imposta la voce config "response.stream" True (e utilizzare "resa") CherryPy gestisce la conversazione tra il server HTTP e il tuo codice come questo:

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

1

Flushing STDOUT può aiutare. Ad esempio, il seguente programma Perl dovrebbe funzionare come previsto: l'articolo di

#!/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

È necessario inserire lo script spinta in una speciale directory wich contengono una .htaccess speciale con questo Environnment specifiche:

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

Voto positivo per "setenv no-gzip". Grazie! –

Problemi correlati