2010-08-11 6 views
1

J'ai un code cgi qui est appelé par AJAX à partir du client javascript. Cependant, le résultat de l'appel est ignoré par le client.Apache 2.2 Délais de Perl CGI, toujours expirés même avec des impressions périodiques

Sur le backend ce code se produit:

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

    #Do stuff 
    $i++; 
} 

Malgré l'impression périodique, sur ce encore interrompue:

[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 

je figure le fait que javascript supprime la sortie ne devrait pas avoir forme d'impact sur si apache permet ou non au script cgi de continuer. Si oui, alors qu'est-ce qui se passe ici?

Répondre

2

La désactivation du délai d'attente pour les scripts CGI pose des problèmes. Étant donné que le résultat de l'appel est ignoré par le client, vous devez à la place fork, demander à l'enfant de terminer le travail et le parent finir rapidement.

Voir Watching long processes through CGI pour une explication. Plus précisément,

Et maintenant, la partie amusante. Nous allons commencer par la ligne 31. Cela permet au processus parent de dire à Apache que nous avons fini de répondre à cette requête, tout en laissant l'enfant partir pour effectuer le long traceroute. & hellip; L'enfant continue, mais il doit d'abord fermer STDOUT, car sinon Apache pensera qu'il y aura peut-être encore une sortie pour le navigateur, et ne répondra pas au navigateur ou ne libérera pas la connexion jusqu'à ce que tout soit résolu.

+0

C'est un processus fourchu. –

+0

Et, fermez 'STDOUT' dans l'enfant et vous quittez immédiatement dans le parent? –

+0

Oh! La fermeture de STDOUT semble le faire fonctionner maintenant. Je vais faire d'autres tests, mais jusqu'ici je n'ai pas encore eu d'erreurs de temps. –

1

La sortie des tampons Perl, veuillez vous assurer que $| est réglé sur une valeur différente de zéro. Apache expire la requête à moins que vous ne désactiviez functionality, qu'il y ait ou non quelque chose qui soit retourné par le côté cgi.

+0

Merde J'ai totalement oublié! Merci, je vais voir si cela aide. Habituellement, je mets juste une nouvelle ligne après mes impressions afin qu'elle vide la sortie. –

+0

Je viens de voir que $ | a été mis à 1 au début de mon code. Donc, cela signifie que le tampon de temps entier a été désactivé, et cela se produit toujours. Donc ça doit être autre chose hm. –

+0

L'expiration du délai d'apache est-elle également désactivée? – szbalint

Questions connexes