はじめに
Perlスクリプトを書いている時に、考えた事/思った事を書いています。 技術的な事以外にも書く予定にしています。
- 目 次 -
■ HTMLファイル置換表示型cgi (1999/12/21)
■ ファイルロック機能/ロックファイル(1999/12/21)
CGI スクリプト
CGI(Common Gateway Interface)は、WWWサーバーの一つの機能です。
CGIその物は、プログラム言語を表す物ではありません。 ただ一般に広く使われているのが、Perlと言うスクリプト言語です。 その為CGI = Perlスクリプトを指すような状態になっています。 厳密に言えば、他の言語で書かれたCGIもあります。
本ページで「CGIスクリプト」と表記された場合は、Perlで書かれたプログラムと言う意味でとらえてください。
HTMLファイル置換表示型cgi
今回公開しているPerlスクリプトに採用している機能です。 利用者が用意したHTMLファイルを読み込んで(文字)変数を置換して表示する機能です。 この機能に寄り自由な表示が可能になります。(多分) しかし通常のcgiにHTMLの表示部分を埋め込んで居る場合に比べ文字列処理が多くなります。 その為少し遅いと思います。
この機能の元々の発想は、 Perlスクリプト内にデータ処理部分と表示処理部分を分離して見やすくする目的でした。 その為、元になるHTMLファイルがスクリプト内に残っています。 サイズを下げる為無くしても問題ないのですけど.. 表示用のhtmlを用意しなくても表示できるメリットがあるので残しています。
sub testhtml { return <<'EOM'; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 //EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <TITLE>test html>/TITLE> </HEAD> <BODY> $Tyear/$Tmon/$Tday $Thour:$Tmin:$Tsec 現在時刻 </BODY> </HTML> EOM }
名残です。(例)
ファイルロック機能/ロックファイル
此処に登録されているPerlスクリプトでは、書き込みを行なうファイルに対して排他的処理を行ないます。 その機能をファイルロック機能を呼びます。
この機能は、同時にファイルに操作するしないようにする事ですが100%機能する訳ではありません。 数μS(数1/1000000秒)または、それよりも短い時間ですが..同時に操作可能状態が発生します。 これにより、書き込みが上手く行かないがあります。
また、Perlスクリプトが動作するサーバーの状態により、このファイルロック機能が動作したままに成る場合があります。 動作したままとは、ロックファイルを作ったまま削除されないでPerlスクリプトが中断された時です。 回復処理は、5分後以降にファイルロック機能が動作した時行ないます。
if (-e "$lockfile") { local(@sts) = lstat($lockfile); local($tm) = time(); if ($tm - $sts[9] > 300) { &unlock; } } local($sym, $retry); $retry = 10; $sym = (eval 'symlink("","");', $@ eq ""); for($i=0; ; $i++) { if ($i >= $retry) { &error('混雑しています。','時間を置いてください。'); } if ( $sym && symlink(".", $lockfile)) { last; } elsif (!$sym && !-e "$lockfile") { if (!open(LOCK,">$lockfile")) { &error('システムエラー','ロックファイルが生成できません。'); } close(LOCK); last; } sleep(2); }
基本構造
- 回復処理
- リトライ回数
- symlink の判断機能
最初のif文内で行なっています。 ロックファイルが300秒(5分)以上持続(存在)した場合、 強制的に削除してからロック処理を行ないます。
通常は、3回から10回で十分でしょう。
チャットプログラム等でサーバー負荷を下げる為、可変できるようにこの様に成っています。
symlinkが使えないシステムでは、通常のファイル生成でロックファイルを作ります。