2009-07-25 7 views
7

Je voudrais être en mesure de permettre à un utilisateur d'afficher la sortie d'un script GCI de longue durée au moment où il est généré plutôt qu'après la fin du script. Cependant, même lorsque je vide explicitement STDOUT, le serveur semble attendre que le script se termine avant d'envoyer la réponse au client. C'est sur un serveur Linux exécutant Apache 2.2.9.Comment puis-je utiliser du contenu CGI non tamponné à partir d'Apache 2?

Exemple python 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." 

exemple similaire en Perl:

#!/usr/bin/perl 

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

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

print "Done."; 

Ce lien indique que la production Apache 1.3 CGI devrait être unbuffered (mais cela pourrait appliquer seulement pour Apache 1.x): http://httpd.apache.org/docs/1.3/misc/FAQ-F.html#nph-scripts

Des idées?

+1

Vous pouvez être potentiellement en cours d'exécution dans le client (navigateur) les problèmes de mise en mémoire tampon -SIDE. – Miles

Répondre

4

Randal article Schwartz Watching long processes through CGI explique un autre (et à mon avis, meilleure) de regarder un long processus en cours d'exécution.

+0

J'ai fini par utiliser une méthode similaire pour mon application, mais je suis toujours curieux de savoir pourquoi la méthode originale ne fonctionne pas dans ma configuration. Tant pis. –

1

Selon CGI::Push,

serveur web Apache depuis la version 1.3b2 sur n'a pas besoin de scripts push serveur installé en tant que scripts NPH: le paramètre -nph à do_push() peut être réglé à un valeur false pour désactiver les en-têtes supplémentaires requis par un script NPH.

Il suffit de trouver l'équivalent do_push en python.

Édition: Jetez un coup d'œil à CherryPy: Streaming the response body.

Lorsque vous définissez l'entrée de configuration "de response.stream" True (et d'utiliser le "rendement") CherryPy gère la conversation entre le serveur HTTP et votre code comme ceci:

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

1

Flushing STDOUT peut vous aider. Par exemple, le programme Perl devrait fonctionner comme prévu:

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

Vous devez mettre votre script push dans un wich répertoire spécial contiennent un .htaccess spécial avec cette specs environnment:

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

Upvote pour "setenv no-gzip". Je vous remercie! –

Questions connexes