hira家の子育て奮闘記 -since 2006.9.29-



2004.04.15 Thursday ●CGI版と mod_perl版 の実行動作の違いについて
□mod_perl について
スクリプトを実行可能状態にコンパイルしてメモリに保持 し続けるがまたそれと同時にスクリプト内で使われる変数に於いても同様の事が起こる。
これは一見なんの問題も無いように思えるがスクリプトの作り方次第では問題が起こることが多い。
実際にサンプルを使って検証してみる。
count.pl:

#!/usr/bin/perl -w
use strict;

print "Content-type: text/plain\n\n";

my $count = 0;

for (1..5) {
increment();
}

sub increment{
$count++;
print "Count is $count \n";
}

上のスクリプトは単にカウンタをインクリメントして表示するプログラムである。
これをCGIとして実行すると次の様な結果になる。
※何度実行しても同じ答えが出るはず。
Count is 1
Count is 2
Count is 3
Count is 4
Count is 5

次に mod_perl 環境で実行するとどうなるだろうか、1度目は上と同じだが2度3度と繰り返すと 値がどんどん増えていってしまう。これでは明らかに目的とは違うスクリプトになってしまう。
Count is 6
Count is 7
Count is 8
Count is 9
Count is 10

これは CGI ではプログラムの終了をもって全てメモリがクリアされるのに対し、 mod_perl 環境に於いてはスクリプトと取得したメモリを保持し続ける事が原因である。
じゃ、どうすればいいんだい?と言われるがスクリプト内では変数を 必ず初期化して尚かつ変数のスコープを限定して利用すれば良いはずである。
さらに言うと use strict; を使い -w オプションを付けて実行しerrorログに何も出てこなければOKなはずだ。
因みに上記のスクリプトを実行すると error ログには次の様に記録される。
Variable "$count" will not stay shared at /home/ishot/public_html/count.pl line 13.
●apache に mod_perl を組み込む

□suEXECを止めるには
suexecの実行モジュールを削除しますが、今回はリネームしておきます。
hanachan@server1:~$ cd /usr/lib/apache/
hanachan@server1:/usr/lib/apache$ sudo mv suexec suexec.STOP
Debian Woody:Apache mod_perlの設定

□PERL use strictを使う
mod_perlを使うときは、変数がキャッシュされてしまうので、use strictを使うと良い。
▼すべてのファイルで共通の変数を記述したファイルを、パッケージにして、呼び出す時は「$パッケージ名::変数名」で使用することにする。



comment...





profile link
 admin
archives
comment
Material ふわふわ。り
(C) 2024 ブログ JUGEM Some Rights Reserved.