- 締切済み
PHPのファイルロックについて
関数flock();について調べてたのですが、 結局、イマイチ使い所がわかりませんでした。 とりあえずCGIを手本として以下のロックを作ってみたのですが、 もし、flockを使うとしたらどのように使うのかアドバイスして欲しいと思っています。 ↓参考プログラム(echo部は進行を表示するためのもの) <?php define ("LOCK_FILE","./lock/lock.txt"); Lock(); Unlock(); //ロック function Lock(){ if(file_exists(LOCK_FILE)){ if(date(U) - filemtime(LOCK_FILE) > 30){ unlink(LOCK_FILE); echo("古いロック削除<br>"); } } $retry = 5; while(file_exists(LOCK_FILE)){ if($retry <= 0){ echo ("error<br>"); exit; } $retry--; sleep(1); } $lockfile = fopen(LOCK_FILE,"w"); fclose($lockfile); echo("ロック完了<br>"); } //アンロック function UnLock(){ unlink(LOCK_FILE); echo("ロック解除<br>"); } ?>
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- moon_night
- ベストアンサー率32% (598/1831)
> ということは、このfilenameにロック用ファイルの、上の例で言うlock.txtを参照させればいいんですね。 > そしてその後、排他ロックとロック解除の間で操作したい対象ファイルを弄ればいいと? > 特にロック用ファイル中に記述する必要はないって事ですよね。 いいえ、間違っています。 flockはファイルをオープンしたときのファイルポインタを設定します。 つまり、ロック用のファイルを自分で用意する必要はありません。PHP側でロック処理をしてくれます。
- 0x131cc6e
- ベストアンサー率36% (42/115)
flock()は開いたファイルに対して排他制御を行う関数です。 ですので使い方としては、 $fp = fopen(filename,"wt") ; if ( !flock( $fp, LOCK_EX ) ) { //エラー処理&ファイルクローズ return ; } //ファイルに対する操作 if ( !flock( $fp, LOCK_UN ) ) { //エラー処理&ファイルクローズ return ; } fclose($fp) ; という感じになります。 複数の人がほぼ同時にこの処理が動くページにアクセスしたら、先にアクセスした人がファイルに対してロックをかけてしまうので、後にアクセスした人は最初のflockでfalseが返されてエラー処理が実行されます。
補足
ということは、このfilenameにロック用ファイルの、上の例で言うlock.txtを参照させればいいんですね。 そしてその後、排他ロックとロック解除の間で操作したい対象ファイルを弄ればいいと? 特にロック用ファイル中に記述する必要はないって事ですよね。
補足
少し出かけていたので返事が遅れました。 ということは、filenameに対象ファイルを当てはめるわけですか? しかしそれだと、排他ロックエラーの際に、 データが真っ白になってしまう可能性が出てきますよね。 その場合は、エラー時の対処のif部分で、 再度書き直すのが常套ということになるのでしょうか? 質問ばかりでスミマセン。