PHP は、恣意的にファイルをロックする汎用の手段を提供します。 (これは、アクセスする全プログラムが同一のロックの方法を使用する 必要があり、そうでない場合は動作しないことを意味します)
注意: flock() 関数は Windows 環境下では必ず行ってください。
flock()は、handleを用いて 操作を行います。これは、オープンされたファイルポインタである必要が あります。operationは、次の値のどれかとな ります。
共有ロック(読み手)とするには、operationに LOCK_SH(PHP 4.0.1より前の場合は1に設定します)をセットします。
排他的ロック(書き手)とするには、 operationにLOCK_EX(PHP 4.0.1より前の場 合は2に設定します)をセットします。
(共有または排他的)ロックを開放するには、 operationにLOCK_UN(PHP 4.0.1より前の場 合は3に設定します)をセットします。
ロック中に flock()でブロックを行いたくない場 合は、operation に LOCK_NB ( PHP 4.0.1 より前の場合は 4 に設定します)を加えます。
flock()により、(ほとんどのUNIXやWindowsさえ含む) ほとんど全てのプラットフォームで使用可能な簡易な読み手/書き手モデ ルが実現されます。ロックをブロックモードとする場合(EWOULDBLOCK errno 条件)にオプションの3番目の引数にTRUEを設定します。 ロックは fclose() でも解放されます (スクリプトが終了した場合も自動的にコールされます) 。
成功した場合に TRUE を、失敗した場合に FALSE を返します。
注意: flock()は、ファイルポインタを必要とするため、 (fopen()へ引数"w"または"w+"を指定して)書き込 みモードでオープンすることにより丸めるファイルにアクセス保護する 特別なロックファイルを使用する必要があるかもしれません。
警告 |
flock()はNFS及び他の多くのネットワークファイ ルシステムでは動作しません。詳細についてはオペレーティングシステ ムのドキュメントを確認ください。 いくつかのオーペレーティングシステムでflock() はプロセスレベルで実装されています。ISAPIのようなマルチスレッド 型のサーバーAPIを使用している場合、同じサーバーインスタンスの並 列スレッドで実行されている他のPHPスクリプトに対してファイルを保 護する際に flock()を使用することはできません! flock() is not supported on antiquated filesystems like FAT and its derivates and will therefore always return FALSE under this environments (this is especially true for Windows 98 users). flock()はFATのような 旧式のファイルシステムではサポートされていないため、 そのような環境の場合は常にFALSEを返すことになります。 (これは特にWindows98ユーザーにとって常に真です) |