JSON::XS под mod_perl не работает с запросами POST

Я использую установку Apache и mod_perl по умолчанию в Ubuntu 16.04.1 LTS, я также воспроизвел это с JSON :: XS по умолчанию и обновил до последней версии из CPAN JSON-XS-3.02.

Код ниже работает во всех случаях, если я не использую mod_perl.

Сценарий и html ниже работают при использовании Perl через mod_cgi как с запросами POST, так и с GET.

Однако, если я использую mod_perl и использую POST (как в предоставленном html), он терпит неудачу, «Hello» не печатается, и я получаю следующую ошибку в моем файле журнала apache.

Использование: JSON::XS::new(класс).

Если я передам те же параметры с помощью метода 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>

person Severun    schedule 18.08.2016    source источник
comment
Нет, это делает то же самое.   -  person Severun    schedule 19.08.2016


Ответы (1)


Итак, это была довольно нудная погоня за гусями, анализ дампов ядра Apache и трассировки стека, исправление ошибок, которых на самом деле не было... Короче говоря.

Я пытался добавить каталог включения в свой perl, используя

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

В рамках этого я добавил

PerlOptions +Parent, чтобы я получал новый интерпретатор для каждого виртуального хоста, чтобы мой -I действовал одновременно только для одного виртуального хоста.

Я добавил эти флаги до того, как включил mod_perl, поэтому, когда я включил mod_perl, он просто не работал.

После удаления PerlOptions +Parent все заработало, как и ожидалось.

В качестве примечания, похоже, что +Parent делает вещи шаткими в целом.

person Severun    schedule 19.08.2016
comment
Еще немного информации об этом. Чтобы использовать +Parent, вы должны использовать мод mpm_worker, который запускает многопоточность Apache. При использовании mpm_worker +Parent работал, но затем у меня были случайные зависания на запросах, когда сервер начал загружаться (не большая нагрузка, например, 10 или 20 одновременных подключений). модуль mpm_prefork, затем добавляю свои PerlSwitches -I в глобальный apache2.conf - person Severun; 25.08.2016