PersistentPerlでCGI.pmが誤動作
PersistentPerlを使うと、2回目以降のリクエストでCGI.pmが-no_xhtmlを忘れてしまう。
- PersistentPerl 2.22
- CGI.pm 3.15
ぎりぎりまで切り分けた再現ケース。
#!/usr/bin/perperl -w print "##### $ARGV[0]\n"; use CGI qw(-no_xhtml); my $cgi = CGI->new(); print $cgi->start_html();
実行結果。
$ touch test.pl; ./test.pl 1; ./test.pl 2 ##### 1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="en-US"><head><title>Untitled Document</title> </head> <body> ##### 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"> <head> <title>Untitled Document</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> </head> <body>
と、このように1回目と2回目以降のリクエストでヘッダが変わってしまう。
CGI.pmを眺めているところだけど、全体的にパッケージ変数をゴリゴリ書き換えながら動いているので、たぶん他にも問題あるなあ。
mod_perlについては専用にいくつも処理が分岐しているところがあるので、PersistentPerlも同じようにケアしてあげないとダメと思われる。ちなみにmod_perlフラグを立てるとApache2.pmに依存してしまうので残念ながら動かない。一方FastCGI用にはCGI::Fastがあるので、比べてしまうとPersistentPerlはちょっとかわいそうな子。
うーん仕事じゃなくてよかった…