CGIとmod_perlの動作の違いに関して
CGIとmod_perlの動作の違いに関して。
CGIプログラミング
p458~460による言葉を引用すれば、
コードは一度にコンパイルされキャッシュされます。そのため、スクリプトのボディにあるレキシカル変数がサブルーチンの中でアクセスされるとクロージャが作成されます。一般的なCGIスクリプトでは次のようなことができます。 my $q = new CGI; check_input( ); . . sub check_input { unless ( $q->param( "email" ) ) { error( $q, "電子メールアドレスが入力されていません" ); } . . このスクリプトでは、check_inputにはCGIオブジェクトを渡していません。それなのに、変数はサブルーチンからは見えています。...CGIでは問題なく機能しますが、mod_perlでは非常に難解で厄介なエラーが発生してしまいます。 -問題は、最初にApacheの子プロセスでスクリプトが実行される際に、CGIオブジェクトの値がキャッシュされたcheck_inputのコピーにトラップされることです。次回以降の同じApacheの子プロセスへの呼び出しはすべて、check_input内の以前のCGIオブジェクトの値が再利用されます。 -この問題は、$qをパラメタとしてcheck_inputに渡すか、または$qをレキシカル変数からグローバルなlocal変数に変更することで解決できます。テストもしてみたが、サブルーチン内の$qは最初以外は2回目以降も同じ値(つまりキャッシュされている)で、サブルーチンの外(スクリプトのボディ)だと、毎回値が変わっているので、このあたりを頭に入れないといけないということ。簡単な方法は、myをourにすればいい。 でも今悩んでいるのは、mod_perlではうまく動くのに、普通のCGI動作だと変な動作をする件。あれこれ悩んで、上の記事も見て、実験したり試行錯誤やってもどうも変。電子の大きさになって調べたい気分。 本件と全く関係ないがさっき思いついたイメージを言葉で表わすと:焼肉換算。 お、あと、パチっとくる、だった(意味不明だ)