2016-12-19 4 views
3

J'essaie d'obtenir des paramètres d'URL en utilisant CGI et FCGI.Accepter les paramètres POST avec FCGI

Lors de l'exécution du script sur mon navigateur, je ne reçois que les paramètres de ma première requête, mais la requête $count ne s'incrémente pas.

use CGI; 
use FCGI; 

my $fcgiRequest = FCGI::Request(); 
while ($fcgiRequest->Accept() >= 0) 
{ 
    print("Content-type: text/html\r\n\r\n", ++$count); 
    my $q = new CGI; 
    print "name = " . $q->param("name") ; 
    print "\n"; 
} 

Répondre

4

Vous ne pouvez pas utiliser CGI.pm et FCGI.pm ensemble comme celui-ci. Vous avez besoin d'un peu de code de glissement entre les deux, car CGI a besoin de lire des éléments de l'environnement, mais pas de la façon dont vous l'invoquez.

Il y a un module CGI::Fast inclus avec Perl qui le fait pour vous. Au lieu d'utiliser CGI et FCGI, vous utilisez simplement CGI::Fast et changez un peu de code.

use strict; 
use warnings; 
use CGI::Fast; 

my $count; 
while (my $q = CGI::Fast->new) { 
    # $q is a fresh CGI object for the current request 

    print("Content-type: text/html\r\n\r\n", ++$count); 
    print "name = " . $q->param("name") ; 
    print "\n"; 
} 

Si vous avez déjà un script CGI, vous pouvez le mettre dans une fonction et l'appeler à l'intérieur de cette boucle.

Si vous êtes intéressé par le fonctionnement de CGI :: Fast, n'hésitez pas à take a look at its source code on CPAN. L'essentiel est que l'environnement et les handles de fichiers (pour STDOUT et STDERR) doivent être mappés à chaque nouvelle requête, alors que votre implémentation a toujours analysé le premier.

Veuillez noter que les exemples dans le perldoc et sur le CPAN que j'ai liés sont très obsolètes et ne représentent pas le code Perl moderne.


Aujourd'hui, vous auriez probably not use CGI plus, comme il a été supprimé à partir de versions Perl courant. Au lieu de cela, vous pouvez jeter un oeil à the PSGI interface specification et Plack sur la façon de l'implémenter. La bonne chose à ce sujet est qu'il fournit une interface claire à travers différentes technologies de déploiement (telles que CGI et Fast CGI). Vous pouvez simplement laisser votre programme s'exécuter en tant que simple CGI avec Apache ou nginx, ou en tant que processus FCGI persistant avec Apache ou d'autres serveurs Web, ou en tant qu'application autonome via divers serveurs Web Plack écrits en Perl et adaptés à des fins spécifiques.

+0

Re « * parce que CGI a besoin de lire des choses de l'environnement * » Oui, mais FCGI définit l'environnement approprié. Ce n'est pas le problème. – ikegami

2

Une fois qu'un objet CGI.pm est créé pour une requête, il est réutilisé là-bas.

Vous pouvez réinitialiser CGI.pm en ajoutant ce qui suit à la fin de la boucle:

CGI::_reset_globals();