sidewalkcafe blog

日々是好日

Windows上ではflockの挙動が違う(PHP)

WindowsローカルにXAMPPを入れてテストしていたのだれども
flockで上手くいかなかったのでメモ

LOCK_NBが使えない

PHPmanualには

PHP: flock - Manual

<引用>
operation は以下のいずれかとなります。

共有ロック(読み手)とするには LOCK_SH をセットします。
排他的ロック(書き手)とするには LOCK_EX をセットします。
(共有または排他的)ロックを開放するには LOCK_UN をセットします。

上の操作のいずれかに LOCK_NB をビットマスクとして追加すれば、 ロック中に flock() でブロックを行わないことができます (Windows ではサポートされていません)。

とあり、windowsではサポートされてないと書いてある。
けど、これだけじゃなかった・・・

LOCK_EXでfile()やfile_get_contentsが使えなくなる

自分で排他的ロック(LOCK_EX)したファイルにfile()やfile_get_contentsでアクセスできない
読み込んだ場合、空白を返してくる


これに気付かず、テストではまっちゃったよ・・・^^;


ロックしたファイルの読み込みはfgetsを使いなさいって事なのなか?

その他

PHP5.3.2以降は、fclose()でロックを自動的に解除する機能がなくなった。

PHP: flock - Manual

<引用>
バージョン 説明
5.3.2 ファイルのリソースハンドルを閉じたときにロックを自動的に解放する機能が削除されました。 ロックの解放は、常に手動で行わなければなりません。

その為、LOCK_UNで明示的に解除する必要がある
・・・のだけれど、注意事項が^^;


PHP5.3.2以降ではfcloseで自動的にアンロックされない - 徳丸浩のtumblr

<以下引用>

ロックした状態でファイルに書き込みをしたい場合、アンロックしてからfcloseするまでの間に、バッファに残っていたデータが *ロックされない状態で* ファイルに書き込まれる可能性があるからです。したがって、アンロックの前に、明示的にfflushを呼び出してバッファの内容をはき出すようにすべきです。

との事。
なのでファイルを閉じるときは

fflush($fp);           // バッファを吐き出す
flock($fp, LOCK_UN);   // ロックを解除
fclose($fp);           // ファイルを閉じる

という記載が必要


[AD]
企業サイトや人気サイトの運用実績多数!月額1,000円(税抜)~の高スペックレンタルサーバーヘテムル