2007年5月16日水曜日

まちがったPHP講座 flockについて



http://www.phppro.jp/school/phpschool/vol27/2


いやぁ、勘違いしているようだ。。。


LOCK_SHすればwrite関数が実行できなくなるのと勘違いしてるのかな?


まぁ、それをLOCK_EXになおしてもflushしわすれてるので、綺麗にロックはかからない。


どーせ君らにロックの正しい理解は無理だ。


ロックはロックファイルを別につくってそれをLOCK_EXでロックしよう。


と最近おもいだした。。。。


だったらひたすらコピペで十分ミスしないから。


同時アクセスが多いときのスループットは最悪に悪いけどま、OKしょや


なので、スクリプトの先頭に以下をたして。



/*基本的にはデータを弄るスクリプトの最初でロック*/
$lfp=fopen("/some/where/lockfile","w");//ロックファイルは絶対パスで指定すること
if($lfp){エラー処理(スクリプトをちゃんと中断すること)}
if(! flock($lfp,LOCK_EX)){エラー処理(スクリプトをちゃんと中断すること)}


スクリプトの最後にこれを足す。



/*データを弄るPHPスクリプトの最後にアンロック*/
fclose($lfp);//ここでロック終了


適当にクラスをつくってコンストラクタでロックして、デストラクタでcloseして


そのインスタンスをPHPのauto prepend機能をつかって自動的によぶといいかも。


そうすればPHPが事実上シングルタスクでしか走らなくなので、


マルチタスクなプログラムを書けない人でも多少安心。














って皮肉ですよ~(たぶん)。





0 件のコメント:

コメントを投稿