【问题标题】:JSON::XS under mod_perl fails with POST requestsmod_perl 下的 JSON::XS 因 POST 请求而失败
【发布时间】:2016-12-25 18:29:57
【问题描述】:

我在 Ubuntu 16.04.1 LTS 上使用 Apache 和 mod_perl 的默认安装,我还使用默认 JSON::XS 复制了它,并从 CPAN JSON-XS-3.02 更新到最新版本。

如果我不使用 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>

【问题讨论】:

  • 不,做同样的事情。

标签: json perl mod-perl2 xs


【解决方案1】:

好的,所以这是一场相当疯狂的追逐,分析 apache 核心转储和堆栈跟踪,修复实际上并不存在的错误......长话短说。

我试图使用

将包含目录添加到我的 perl

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

作为其中的一部分,我添加了

PerlOptions +Parent 这样我就可以为每个虚拟主机获得一个新的解释器,这样我的 -I 一次只对一个虚拟主机有效。

我在启用 mod_perl 之前添加了这些标志,所以当我启用 mod_perl 时,它就无法正常工作。

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

顺便说一句,+Parent 似乎让事情变得很奇怪。

【讨论】:

  • 更多信息。要使用 +Parent,您必须使用运行 Apache 多线程的 mpm_worker mod。使用 mpm_worker 时,+Parent 工作,但是当服务器开始加载时我的请求随机挂起(负载不大,比如 10 或 20 个同时连接)我最终采用的解决方案是运行多个 Apache 实例mpm_prefork 模块,然后将我的 PerlSwitches -I 添加到全局 apache2.conf
猜你喜欢
  • 2021-09-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多