2016-08-18 3 views
1

J'utilise l'installation par défaut d'Apache et mod_perl sur Ubuntu 16.04.1 LTS, j'ai reproduit ce avec la valeur par défaut JSON :: XS et je mis à jour à la dernière CPAN JSON-XS-3.02.JSON :: XS mod_perl échoue avec les requêtes POST

Le code ci-dessous fonctionne dans tous les cas, si je ne l'utilise mod_perl.

Le script et html ci-dessous fonctionnent avec perl via mod_cgi à la fois POST et GET demandes. Si toutefois j'utilise mod_perl et que j'utilise un POST (comme dans le html fourni), il échoue, "Hello" ne s'imprime pas, et j'obtiens l'erreur suivante dans mon fichier journal Apache.

Utilisation: JSON :: XS :: nouveau (Klass).

Si je passe le même paramètre (s) par une méthode GET, le script fonctionne très bien.

test2.pl

#!/usr/bin/perl 
use strict; 
use warnings; 
use CGI; 
use JSON::XS; 

my $q = new CGI(); 
print $q->header(-type => 'text/plain'); 
my $action = $q->param('a'); 
my $json_str = '{"foo":"bar"}'; 
my $pscalar = JSON::XS->new->utf8->decode($json_str); 
print "Hello"; 
exit 1; 

HTML pour appeler ce qui précède (le nom test2.pl sur le serveur)

<html> 
<body> 
<form action="test2.pl" method="POST"> 
<input type="text" name="a"/> 
<button type="submit"> 
</form> 
</body> 
</html> 
+0

Non, cela fait la même chose. – Severun

Répondre

0

OK Donc, ce fut une chasse à l'oie sauvage plutôt, l'analyse des décharges de base apache et empiler des traces, corriger des bugs qui n'y étaient pas vraiment ... Longue histoire courte.

Je tentais d'ajouter un include à mon perl en utilisant

PerlSwitches -I/usr/local/lib/site_perl/my_new_directory

Dans le cadre de ce que j'ai ajouté

PerlOptions + Parent afin que j'obtienne un nouvel interpréteur pour chaque hôte virtuel afin que mon -I ne soit efficace que pour un seul hôte virtuel à la fois.

j'avais ajouté ces drapeaux avant mod_perl a permis, quand je mod_perl permis, ça n'a jamais fonctionné. En supprimant PerlOptions + parent, les choses ont commencé à fonctionner comme prévu.

En note, il semble que + Parent rend les choses bancales en général.

+0

Quelques informations supplémentaires à ce sujet. Pour utiliser + Parent, vous devez utiliser le mod mpm_worker qui exécute Apache multi-thread. Lors de l'utilisation de mpm_worker, le + Parent a fonctionné, mais je me suis bloqué sur les requêtes lorsque le serveur a commencé à charger (pas beaucoup de charge, comme 10 ou 20 connexions simultanées). La solution que j'ai utilisée est d'exécuter plusieurs instances Apache avec Module mpm_prefork, puis ajout de mes PerlSwitches -I au global apache2.conf – Severun