2016-08-18 66 views
1

我在Ubuntu 16.04.1 LTS上使用Apache和mod_perl的默认安装,我也用默认的JSON :: XS转载了这个,我更新到了最新的CPAN JSON-XS-3.02。mod_perl下的JSON :: XS失败,POST请求

下面的代码适用于所有情况下,如果我不使用mod_perl。

下面的脚本和html通过mod_cgi同时使用POST和GET请求来使用perl时工作。

如果不过我使用的是mod_perl并且使用POST(如在提供的html中),它会失败,“Hello”不会打印,并且在我的apache日志文件中出现以下错误。

用法:JSON :: XS :: new(klass)。

如果我通过GET方法传递相同的参数,那么脚本工作正常。

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调用以上(在服务器上名为test2.pl)

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

没有,做同样的事情。 – Severun

回答

0

OK所以这是一个相当徒劳无益的,分析Apache的核心转储和堆栈痕迹,修复那些并不存在的错误......长话短说。

我试图用

PerlSwitches -I在/ usr/local/lib目录/ SITE_PERL/my_new_directory

由于这部分我加

PerlOptions添加一个包括目录到我的Perl + Parent,这样我就可以为每个虚拟主机获得一个新的解释器,所以我的-I一次只对一个虚拟主机有效。

我在启用mod_perl之前添加了这些标志,所以当我启用mod_perl时,它从未工作。

通过删除PerlOptions +父事情开始按预期工作。

作为一个方面说明,它出现+父母使东西在一般形式。

+0

关于此的一些更多信息。为了使用+ Parent,你必须使用运行Apache多线程的mpm_worker mod。当使用mpm_worker时,+ Parent工作,但随后服务器开始加载时请求随机挂起(没有太多负载,例如10或20个同时连接)。我最终使用的解决方案是运行多个Apache实例mpm_prefork模块,然后将我的PerlSwitches -I添加到全局apache2.conf – Severun