Est-ce que mes scripts CGI non modifiés sont plus rapides avec mod_perl?

Mon serveur Apache utilisait auparavant des scripts CGI écrits en Perl. J’ai entendu dire que l’utilisation de mod_perl était beaucoup plus rapide que l’utilisation de scripts cgi standard. J’ai donc essayé de configurer mod_perl sur mon serveur. D’après cette page , tout ce que j’avais à faire pour que mes scripts CGI s’exécutent sous mod_perl était de modifier mon fichier httpd.conf. J’ai ajouté les lignes suivantes à la fin de mon httpd:

LoadModule perl_module libexec/apache2/mod_perl.so  SetHandler perl-script PerlResponseHandler ModPerl::Registry Options ExecCGI PerlSendHeader On Order allow,deny Allow from all  

Si je vérifie pour

  existe $ ENV {"MOD_PERL"} 

dans un fichier CGI, la variable MOD_PERL semble être présente. Je suis donc certain que mod_perl est configuré et opérationnel.

Ma question est la suivante: est-ce que mon script CGI complètement inaltéré subit une accélération? Est-ce que je peux faire quelque chose pour accélérer encore plus? Ou est-ce que d’autres travaux ne valent pas vraiment la peine pour l’accélération? Est-ce que quelqu’un a de l’expérience avec ce genre de choses?

J’ai cherché de la documentation et des forums pour une réponse, mais je ne peux pas vraiment trouver quoi que ce soit. Merci d’avance pour votre aide!

Oui, un script CGI complètement inchangé connaîtra une accélération avec mod_perl, en utilisant le gestionnaire ModPerl :: Registry, tant que tout est configuré correctement, et il semble que ce soit le cas.

La raison en est que c’est plus rapide qu’Apache exécute maintenant le script avec l’interpréteur Perl intégré au lieu de lancer un nouvel interpréteur pour chaque requête. En outre, vos scripts sont mis en cache et conservés en mémoire, ce qui évite à Perl de les recomstackr, de recharger tous les modules que vous use , etc. Vous pouvez même les charger au démarrage avec ModPerl :: RegistryLoader, afin qu’ils soient déjà en cache et prêt à recevoir le premier visiteur sur votre page.

Comment pouvez-vous les rendre encore plus rapides? On pourrait écrire un livre sur ce sujet. Vous pouvez commencer par déplacer le code vers les modules au lieu des scripts. On pourrait utiliser l’API mod_perl native, mais je recommande d’utiliser un framework qui supporte plusieurs architectures (la plupart d’entre elles supportent tous: mod_perl, psgi / Plack et FastCGI).

Attention, un inconvénient majeur de ModPerl :: Registry est que vous ne pouvez pas fermer sur un fichier my propres variables dans un sous-programme. Cela provoquera la mise en cache de la variable. (Activez les warnings , et si cela se produit, vous verrez un avertissement “$ x ne restra pas partagé”. Vous pouvez soit les transmettre au sous sous forme de parameters, soit les changer pour our variables.)

Vous n’avez pas à recharger perl lui-même. Tous les modules que vous chargez ne devront pas être chargés la deuxième fois. Le script lui-même n’est compilé qu’une seule fois. Il y a définitivement des économies.

Votre question est partiellement résolue dans une question similaire: CGI est-il encore lent lorsqu’il est utilisé avec un programme compilé qui ne nécessite pas de machine virtuelle?

La réponse liée et son matériel de lecture discutent des différences entre CGI et FastCGI ou d’autres technologies (comme mod_perl, par exemple).

Pour paraphraser et développer la réponse:
Vous verrez probablement une accélération, mais cela peut être négligeable. Cela dépend fortement de la charge de travail de votre programme. Des charges de travail légères avec beaucoup de demandes verront probablement les améliorations de performances les plus importantes.

Lorsque vous envisagez une optimisation supplémentaire, demandez-vous d’abord si cela est nécessaire. Beaucoup plus de lecture sur l’optimisation du programme à http://en.wikipedia.org/wiki/Program_optimization