この記事「PHP5.3.2以降ではfcloseで自動的にアンロックされない - 徳丸浩のtumblr」で PHP 5.3.2 から fclose で自動的に flock が呼ばれなくなったというのを知り衝撃を受けました。 衝撃だったのは PHP 5.3.1 以前は fclose で明示的に flock されている ということに対してです。 fclose で暗黙的にロックが解放されるというのは知っていましたが、てっきりファイルディスクリプタが複製も含めて全て閉じられたらロックも解放されることを言っているのだと思っていました。 しかも↓の差分とかを見た感じ、単に fclose から flock が削除されたのではなく、ストリームリソースの後処理から flock が削除されたっぽいからです。つまり、以前の PHP ではファイルのストリームリソースの後処理で明示的に flock が呼ばれていた、と
PHP の flock 関数を数年ぶりに使用したのですが、すごい勘違いをしていました。DB を使用するようになってからいうものめっきりファイルロックなど使わなくなっていたので。。。(言い訳です^^) PHP: flock – Manual 返り値 成功した場合に TRUE を、失敗した場合に FALSE を返します。 と書かれていたので、てっきりロックできなかった場合に FALSE が返るのかと思っていました。 $fp = fopen(dirname(__FILE__)."/lock", "w+"); if (!flock($fp, LOCK_EX)) { triger_error('排他処理中のため実行できません', E_USER_ERROR); } として、sleep(60) などで実行を1分間止めて同じプログラムを実行し、ロックできなくてエラーになると想定してテストをしてみたところ、
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く