- 【PHP】下らねぇ質問はここに書き込みやがれ 5 [無断転載禁止]©2ch.net
667 :デフォルトの名無しさん[sage]:2016/06/11(土) 12:34:32.72 ID:vIdecit0 - >>659
オープンと無ければ作成は同時にできる。 そこで取得したハンドルを flock すれば何の問題も無い。 でも、ロックファイルと本当に読みたいファイルは分けておくと何かといいと思う。 ロック方式を変える場合とか、データファイルの読み書きに fread じゃなく fire_get_contents とか include とか使いたいとか、 いろいろと融通が利くようになるから。 一度やれば面倒なんてことはないから、たったそれだけのために DB に走るのはまだ早い。
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 5 [無断転載禁止]©2ch.net
668 :デフォルトの名無しさん[sage]:2016/06/11(土) 12:40:53.02 ID:vIdecit0 - たったこれだけ。
$lock = fopen('.lock', 'a'); flock($lock, LOCK_EX); <排他されたコード> fclose($lock); 排他されたコードとして、データファイル読んで操作して更新する処理を書けばいい。 更新の仕方を工夫すると、共有ロックと排他ロックを使い分けて同時アクセス時のパフォーマンスも上げられる。
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 5 [無断転載禁止]©2ch.net
674 :デフォルトの名無しさん[sage]:2016/06/11(土) 13:09:52.19 ID:vIdecit0 - >>670
燃えそうw
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 5 [無断転載禁止]©2ch.net
678 :デフォルトの名無しさん[sage]:2016/06/11(土) 13:19:18.72 ID:vIdecit0 - >>676
排他する対象がひとつの DB の内容だけにとどまっていれば適当にやってもそうそうデッドロックしないかもしれないけどな。 余所の DB やシステムと連携したり限られたデバイスやリソースを共有するとか、排他は奥が深いぞ。
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 5 [無断転載禁止]©2ch.net
680 :デフォルトの名無しさん[sage]:2016/06/11(土) 13:25:50.01 ID:vIdecit0 - >>679
ファイルロックがあれば基本的になんでも排他できるだろ。 セマフォとか知らないか? あれも実装によってはファイルロックだぞ。
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 5 [無断転載禁止]©2ch.net
681 :デフォルトの名無しさん[sage]:2016/06/11(土) 13:30:10.44 ID:vIdecit0 - なんでもは言いすぎだったな。
でもいろんな応用をするための基礎だからやっとけって。
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 5 [無断転載禁止]©2ch.net
685 :デフォルトの名無しさん[sage]:2016/06/11(土) 13:42:44.74 ID:vIdecit0 - >>683
DB 使うなとは言ってないぞ。 手持ちのカードが多ければ好きに使い分けられるだろ。 お前はアクセスカウンター作るにもDB使うんだろうが、その選択しかできないのであれば潰しがきかないぞ。
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 5 [無断転載禁止]©2ch.net
688 :デフォルトの名無しさん[sage]:2016/06/11(土) 13:46:22.53 ID:vIdecit0 - >>684
LOCK_UN 必須の件は初耳だったけど、それ本当? この辺の機能は OS の機能をそのまま使ってて、そんなに差がでる部分じゃないというか、ハンドル閉じてロックだけ残るってどういう事情だよって感じだが。 ハンドルを複製してるケースとかかな?
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 5 [無断転載禁止]©2ch.net
690 :デフォルトの名無しさん[sage]:2016/06/11(土) 13:53:03.18 ID:vIdecit0 - >>684
5.3.3 で試したけど、少なくとも >>668 の使い方では LOCK_UN の明示は要らないね。
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 5 [無断転載禁止]©2ch.net
715 :デフォルトの名無しさん[sage]:2016/06/11(土) 21:39:16.03 ID:vIdecit0 - >>712
マニュアルに書いてあることにケチつける気は全く無いんだけど、 Linux の 5.3.3 と Windows7 の 5.6.22 で実験しても、LOCK_UN が必要だと思われる挙動が認められない。 fclose だけでロックは外れるし、同プロセス内で同じハンドルに対してアンロックも fclose もしないまま 2重にロックを掛けてもデッドロックしない。 どういうケースで LOCK_UN の明示が必要なんだろう? 実験コードはこれ。 $lock = fopen('lock','a'); echo "start\n"; if(!flock($lock, LOCK_EX)) { echo "fail 1\n"; exit(1); } echo "locked 1\n"; // ロック成功 if(!flock($lock, LOCK_EX)) { echo "fail 2\n"; exit(1); } echo "locked 2\n"; // 二重ロックでもデッドロックしていない fgets(STDIN); // ENTER が押されるまで待つ fclose($lock); // アンロックせずクローズ print "unlocked\n"; sleep(5); // プロセスの終了を引き延ばす(ロック残り状態があるならそれを維持する) print "end\n";
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 5 [無断転載禁止]©2ch.net
718 :デフォルトの名無しさん[sage]:2016/06/11(土) 22:43:11.56 ID:vIdecit0 - >>716
アンロックも fclose もせずに fopen からやり直したに一票。 $lock = fopen('lock','a'); flock($lock, LOCK_EX); echo "locked 1\n"; $lock = fopen('lock','a'); flock($lock, LOCK_EX); echo "locked 2\n"; それは置いといて、仕様変更の事情が気になったので PHP のソースを読み始めた。 読んで分かるかは分からんけど、とりあえずソースを flock で grep したところから辿ってる。
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 5 [無断転載禁止]©2ch.net
723 :デフォルトの名無しさん[sage]:2016/06/11(土) 23:46:33.60 ID:vIdecit0 - >>722
上書きしてるから起こるんだよ、オブジェクトみたいに変数上書きしたら参照が無くなった方が勝手に破棄されるんじゃないから。 でも本質は、一つのハンドルには何度繰り返しロックをしてもスルーされるけど、一つのファイルでも別個の 2つのハンドルを取得しちゃった場合、 その両方にロックを掛けたらそりゃ 2度目の方はブロックされるという点。 意図せずこのバグを引き起こすケースとしてはこんな感じじゃね。 $lock = fopen('lock','a'); flock($lock, LOCK_EX); <なんかの処理、でもうっかり $lock の値を壊してしまう> fclose($lock); // ロックを解放したつもりだけど、$lock が正しいハンドルを示していないから失敗、ハンドルリーク $lock = fopen('lock','a'); flock($lock, LOCK_EX); // 二度目のロック、同じファイルだけどさっきのロック取得済みのハンドルとは別ハンドルになるからロックを取得できない :
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 5 [無断転載禁止]©2ch.net
724 :デフォルトの名無しさん[sage]:2016/06/11(土) 23:50:10.54 ID:vIdecit0 - >>723
ごめんうそ言った。 ハンドルを上書きしたらクローズされてるみたいね? なので >>723 は忘れて。
|