- 1 名前:デフォルトの名無しさん mailto:sage [2016/05/11(水) 21:46:50.27 ID:e/4BOK4y.net]
- PHPに関する下らない質問用避難スレです。
まず読むこと【PHPマニュアル】 www.php.net/manual/ja/ 前スレ 【PHP】下らねぇ質問はここに書き込みやがれ 4 [無断転載禁止]©2ch.net echo.2ch.net/test/read.cgi/tech/1457792733/ 次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。
- 635 名前:デフォルトの名無しさん mailto:sage [2016/06/09(木) 12:52:46.82 ID:1e+LEmpu.net]
- >>629
そういうことする為にwebプログラム言語はあるんだ。
- 636 名前:デフォルトの名無しさん mailto:sage [2016/06/09(木) 18:58:43.72 ID:Z+K8nZfh.net]
- なんで uy がここにいんの?
- 637 名前:デフォルトの名無しさん mailto:sage [2016/06/09(木) 21:48:33.33 ID:gOehAXHk.net]
- PHPでフォークをしてみたいのですが
子プロセスが全部終了するのを親が待つのは 作った子の数だけpcntl_waitすればいいのでしょうか? 子が死んだ時に待ってる制御が必ず戻ってくるのか、 というところに不安があります もし待っているのに制御が戻らないと、永久ループになりますよね そのへんは心配いらないのでしょうか?
- 638 名前:デフォルトの名無しさん mailto:sage [2016/06/09(木) 21:49:19.88 ID:gOehAXHk.net]
- ×子が死んだ時に待ってる制御が必ず戻ってくるのか
○子が死んだ時に制御が必ず戻ってくるのか でした
- 639 名前:デフォルトの名無しさん mailto:sage [2016/06/09(木) 22:59:36.92 ID:gOehAXHk.net]
- $childPidList = [];
for ($i=0; $i<5; $i++){ $pid = pcntl_fork(); if (!$pid){ echo getmypid()." forked\n"; sleep(100); exit(); }else{ $childPidList[] = $pid; } } while (count($childPidList)){ $pid = pcntl_wait($status); $idx = array_search($pid,$childPidList); unset($childPidList[$idx]); echo "{$pid} ended\n"; } こんな風にしてからkill -9で子プロセスを外から強制終了させても、 ちゃんと制御が戻りました 心配しなくても良さそうですね?
- 640 名前:デフォルトの名無しさん mailto:sage [2016/06/10(金) 03:12:35.40 ID:0e6lKjME.net]
- 1つのファイルに1つのclassが書かれてるとして、許せる行数/KiB数はどのくらい?
- 641 名前:デフォルトの名無しさん mailto:sage [2016/06/10(金) 04:50:15.18 ID:9JKXGlcv.net]
- >>637
IDE使ってれば勝手に教えてくれる。 まだテキストエディタで書いてるのか?
- 642 名前:デフォルトの名無しさん mailto:sage [2016/06/10(金) 08:24:36.60 ID:PSfQ4+av.net]
- 最近のIDEは行数にまで口出してくるのか。うぜえなw
- 643 名前:デフォルトの名無しさん [2016/06/10(金) 10:09:46.35 ID:mlu6vup/.net]
- 時代はJavaScriptよ
Mode.jsなら何でも出来る
- 644 名前:デフォルトの名無しさん mailto:sage [2016/06/10(金) 10:19:00.19 ID:QeldepT2.net]
- >>639
「変数が再定義されています。予期しない不具合を避けるため別の名前を用いて下さい」とかまで言ってくれるぞ。可愛いだろ?時々ぶっ壊したくなるけど。
- 645 名前:デフォルトの名無しさん mailto:sage [2016/06/10(金) 10:21:02.62 ID:wJTDb5hO.net]
- うちはもう全部SATAだぞ
いい加減古いPCは捨てろよ
- 646 名前:デフォルトの名無しさん mailto:sage [2016/06/10(金) 11:16:48.36 ID:vAcnizog.net]
- サーバーのファイルを直接的に編集できるからNotepad++使ってるんだけど
こうしたFTP機能があるIDEってある?
- 647 名前:デフォルトの名無しさん mailto:sage [2016/06/10(金) 12:29:34.80 ID:QeldepT2.net]
- 大抵のIDEはできるんじゃねえの?
そういう事はやらんからよく知らんけどやってる奴は見た。
- 648 名前:デフォルトの名無しさん mailto:sage [2016/06/10(金) 12:54:52.57 ID:vAcnizog.net]
- >>644
ありがとう。 IDEは重いから避けてたけど、勉強がてらもう一度やってみます。
- 649 名前:デフォルトの名無しさん mailto:sage [2016/06/10(金) 14:36:45.66 ID:VX0S6iFV.net]
- phpの関数の引数の順番に迷うことが多いです
覚えやすいコツありますか?
- 650 名前:デフォルトの名無しさん mailto:sage [2016/06/10(金) 14:38:09.38 ID:VX0S6iFV.net]
- たとえばarray_searchなら
arrayをサーチするんだからarrayの方が先やろ→誤 となります
- 651 名前:デフォルトの名無しさん mailto:sage [2016/06/10(金) 15:57:07.05 ID:gE4dMqOe.net]
- >>646
覚えることを諦めてIDEに教えてもらう
- 652 名前:デフォルトの名無しさん mailto:sage [2016/06/10(金) 18:47:17.98 ID:9JKXGlcv.net]
- >>648
いい流れだ。腕を上げたな。 >>646 覚えなくてもいいから何が何でもphp.net検索しろ。 たまに下の方まで読むといろいろためになる情報が書いてあったりする。
- 653 名前:デフォルトの名無しさん mailto:sage [2016/06/10(金) 18:50:21.21 ID:9JKXGlcv.net]
- >>647
そういうのはJavaScriptみたいなのがいいよな。 array.join(",") みたいなの。ずっと分かりやすい。 Rubyもこんな感じだったっけか。
- 654 名前:デフォルトの名無しさん [2016/06/10(金) 18:54:05.44 ID:TQGlf4QP.net]
- PHPStorm使えばいいんだろ?
- 655 名前:デフォルトの名無しさん mailto:sage [2016/06/10(金) 19:02:50.34 ID:4O+4qcPo.net]
- PSR-2フォーマッタついててPHPマニュアルがすぐ引けるなら何でもいい
- 656 名前:デフォルトの名無しさん mailto:sage [2016/06/10(金) 19:31:49.15 ID:9JKXGlcv.net]
- >>651
PHPStormは有償だから必ずしも職場で使えるとは限らない。 使えればラッキーだが、使えなかった時の事も考えておかなければならない。
- 657 名前:デフォルトの名無しさん mailto:sage [2016/06/10(金) 20:18:43.09 ID:nh6LPx54.net]
- >>612
なんで特定の本の話題出してそれに答えなきゃならんのか もってること前提で質問されてもここはサポセンじゃないわけでな ちなみに本に頼ったことなどない
- 658 名前:デフォルトの名無しさん [2016/06/10(金) 20:26:02.28 ID:TQGlf4QP.net]
- >>654
亀レスにも程が有るのでは?
- 659 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 02:22:58.71 ID:BPhbrCpU.net]
- 亀をいじめないで!
- 660 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 05:12:42.04 ID:YhzsbXwG.net]
- 40レスぐらいで亀って随分平和になったな
- 661 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 06:46:43.40 ID:U0YLx5iK.net]
- レス数の問題だと思う奴は頭の障害疑ったほうがいいぞ。
普通は時間とタイミングを考慮する。
- 662 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 11:22:18.74 ID:7IE41uX0.net]
- ファイルをオープン(なければ作成)
→ロック →読み込んで配列にunserialize →配列の内容を変更 →配列をserializeしてファイルに書き込み →ロック解除 ということをやりたいのですが、 ロックする前の、もしファイルがなければ作成する、という処理の部分は 排他的ではないので、変なことが起きる可能性があるんじゃないかという気がします どうなんでしょうか?
- 663 名前:デフォルトの名無しさん [2016/06/11(土) 11:35:30.80 ID:BbMy6dfc.net]
- >>659
其の通り
- 664 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 12:05:21.84 ID:U0YLx5iK.net]
- そういう心配しなくてもいいようにDBつかうんだぬー
わざわざファイル操作で頭悩まさると禿げるんだぬー
- 665 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 12:11:12.11 ID:7IE41uX0.net]
- でも良くある処理ではありますよね?
どうすれば問題が出ないようにできますか?
- 666 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 12:18:20.33 ID:enSm4S6w.net]
- 何らかの方法で排他的ロック方法を採用する
動作させるOSによって色々方法はある
- 667 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 12:21:08.46 ID:e5AOazPt.net]
- uniqid()とかで一意なファイル名にする
- 668 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 12:24:02.14 ID:enSm4S6w.net]
- →ロック
→ファイル操作 →ロック解除
- 669 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 12:30:39.02 ID:rc3AwP02.net]
- >>661
DBならそういう心配しなくていいと思ってるからお前禿げてるんだろ?
- 670 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 12:34:32.72 ID:vIdecit0.net]
- >>659
オープンと無ければ作成は同時にできる。 そこで取得したハンドルを flock すれば何の問題も無い。 でも、ロックファイルと本当に読みたいファイルは分けておくと何かといいと思う。 ロック方式を変える場合とか、データファイルの読み書きに fread じゃなく fire_get_contents とか include とか使いたいとか、 いろいろと融通が利くようになるから。 一度やれば面倒なんてことはないから、たったそれだけのために DB に走るのはまだ早い。
- 671 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 12:40:53.02 ID:vIdecit0.net]
- たったこれだけ。
$lock = fopen('.lock', 'a'); flock($lock, LOCK_EX); <排他されたコード> fclose($lock); 排他されたコードとして、データファイル読んで操作して更新する処理を書けばいい。 更新の仕方を工夫すると、共有ロックと排他ロックを使い分けて同時アクセス時のパフォーマンスも上げられる。
- 672 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:02:26.63 ID:U0YLx5iK.net]
- >>666
DBはそういうこといちいち考えなくても大丈夫な仕組みがいっぱいあるんだぬー そんな事もわからないからおまえは666とか不吉な数字なんだぬー おまえみたいなとんちきはオジー・オズボーンと一緒に田舎のババアから十字架持って追いかけられるといいんだぬー アホが治るぬー
- 673 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:05:21.79 ID:U0YLx5iK.net]
- >>668
> fire_get_contents とか あうあうあうあうあうあうあうあうあう… やばいよやばいよやばいよ… いろいろやばいよ…
- 674 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:06:01.45 ID:rc3AwP02.net]
- >>669
その大丈夫な仕組みが>>668みたいなコードなわけだけど DBとファイルでやってることが根本的に違うわけでもなしに 言ってることもキチガイじみてるし病院いったほうがいいよ^^;;
- 675 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:06:40.55 ID:U0YLx5iK.net]
- やばくないか… 酔っ払ってるから何言いたいのかよーわからん
後で読み返す。
- 676 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:07:43.11 ID:U0YLx5iK.net]
- >>671
だったらおまえはずっとファイル操作でしこしこやってたらいいんだぬー
- 677 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:09:52.19 ID:vIdecit0.net]
- >>670
燃えそうw
- 678 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:10:00.47 ID:rc3AwP02.net]
- 酔っ払ってるを言い訳にするぐらいなら書くなよ
だからお前のコードはデッドロックばっかおこしてるんだぜ
- 679 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:14:29.55 ID:U0YLx5iK.net]
- >>675
デッドロックなんて気にしてるってことがおまえがアホみたいな事やってる証拠なんだぬー 俺様はそんなしんぱいしなくてもいいようにシステムを作るので全く無縁の話なんだぬー
- 680 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:16:52.88 ID:U0YLx5iK.net]
- >>667がどんなアホかと思ったけど、よく読んでみたら
ファイルをロックしていても読める関数使えって事らしいから、 本物のアホではないみたいだぬー ただ、やってることが旧時代的でアホらしくてやってられないんでぬー
- 681 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:19:18.72 ID:vIdecit0.net]
- >>676
排他する対象がひとつの DB の内容だけにとどまっていれば適当にやってもそうそうデッドロックしないかもしれないけどな。 余所の DB やシステムと連携したり限られたデバイスやリソースを共有するとか、排他は奥が深いぞ。
- 682 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:24:19.64 ID:U0YLx5iK.net]
- >>678
その事と本件が何の関係があるんだぬー ファイルロックしてれば他所のシステムと連携した場合でも簡単に排他できるのかぬー? よっぽど大変になるのが目にみえてるんだぬー おまえが物事の深さを語るのは108年早いんだぬー
- 683 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:25:50.01 ID:vIdecit0.net]
- >>679
ファイルロックがあれば基本的になんでも排他できるだろ。 セマフォとか知らないか? あれも実装によってはファイルロックだぞ。
- 684 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:30:10.44 ID:vIdecit0.net]
- なんでもは言いすぎだったな。
でもいろんな応用をするための基礎だからやっとけって。
- 685 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:36:56.47 ID:U0YLx5iK.net]
- >>680
「なんでも排他できるだろ」っておまえはアホかぬ? 排他する事だけがシステムの目的みたいになってるアホ発言だぬー そんなにはいたいなら医者行けばいいぬー ファイルで取り回すよりDB使ったほうがやれることがはるかに膨大なんだぬー 排他なんてそのうちのほんの1メリットだぬー だったらDB使っちゃったほうがお得だぬー とか言ってると、「DB使えない場合はどうすんだ」とか言うアホがでてくるんだぬー だから今のうちに言っとくぬー 一般的でないケースの事なんか知るかハゲ!
- 686 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:38:31.55 ID:U0YLx5iK.net]
- >基礎だからやっとけって。
DBは今時常識だからやっとけって。
- 687 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:41:00.34 ID:c3/xDSGs.net]
- >>668
if (flock($lock, LOCK_EX)) { ... } という風に失敗した場合の分岐を用意しよう また新しいPHP(5.3.2以降)では手動でflock($lock, LOCK_UN)する必要があるらしい
- 688 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:42:44.74 ID:vIdecit0.net]
- >>683
DB 使うなとは言ってないぞ。 手持ちのカードが多ければ好きに使い分けられるだろ。 お前はアクセスカウンター作るにもDB使うんだろうが、その選択しかできないのであれば潰しがきかないぞ。
- 689 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:43:06.58 ID:U0YLx5iK.net]
- ほら、なんかいろいろとめんどくさい情報がくっついてきたぬー
おまえら、人生楽しそうだぬー
- 690 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:45:16.50 ID:U0YLx5iK.net]
- >>685
ファイル操作にこだわってるお前のほうが潰しきかないから他人の心配してる暇ないんじゃないかぬー?
- 691 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:46:22.53 ID:vIdecit0.net]
- >>684
LOCK_UN 必須の件は初耳だったけど、それ本当? この辺の機能は OS の機能をそのまま使ってて、そんなに差がでる部分じゃないというか、ハンドル閉じてロックだけ残るってどういう事情だよって感じだが。 ハンドルを複製してるケースとかかな?
- 692 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:49:14.38 ID:U0YLx5iK.net]
- >>688
おまえが調べてQiitaにでもまとめといてくれぬ。 必要になった時に見てやるぬ。 それまでは俺様は優雅にDB使ってるぬ。
- 693 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:53:03.18 ID:vIdecit0.net]
- >>684
5.3.3 で試したけど、少なくとも >>668 の使い方では LOCK_UN の明示は要らないね。
- 694 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:55:02.40 ID:c3/xDSGs.net]
- >>688
ついさっき確認したら変更履歴にそう書いてあったからであって、俺は検証してないよ php.net/manual/ja/function.flock.php どうなるのか想像でしかないが、解放しないと2度目からFALSE返すとかじゃね
- 695 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:57:05.92 ID:U0YLx5iK.net]
- 圧倒的な人柱感
- 696 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 13:58:16.03 ID:U0YLx5iK.net]
- そういう、ファイルシステムの影響モロに受けそうな処理を平気でやる人たちって、
結局心が強いんだろうな。 オレはチキンだから無理だぬー
- 697 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 14:18:34.99 ID:a1oB3JFl.net]
- まーた馬鹿が暴れてるのかー
- 698 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 14:24:21.01 ID:U0YLx5iK.net]
- まーた馬鹿が戯言だけホザくのかー
- 699 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 14:29:21.37 ID:U0YLx5iK.net]
- 本当に、まともな思考力のある人間はいないのかねぇ…
- 700 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 14:39:42.63 ID:a1oB3JFl.net]
- え?自分がまともな思考力もってると思ってんの?
- 701 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 14:46:49.83 ID:7IE41uX0.net]
- >>668
ロック用ファイルを別に用意するんですね ありがとうございます ちなみにやたらdbを推してる狂人がいますが 今書いてるのはなるべく他のプログラムを使いたくないものなので、 今のところdbは考えていません
- 702 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 14:54:08.42 ID:U0YLx5iK.net]
- >>697
自己紹介乙 このスレの参加者は自己紹介だけは得意だ
- 703 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 14:55:15.54 ID:U0YLx5iK.net]
- >>698
なんか修行でもしてるんだ。学生は暇でいいね。
- 704 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 14:57:12.43 ID:U0YLx5iK.net]
- PHPerはとにかく何でもPHPでやりたがるというのは本当だな。
脳みそが崩壊してる。
- 705 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 15:36:01.25 ID:a1oB3JFl.net]
- ノウミソ崩壊って自己紹介はやめろって!
- 706 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 15:43:02.88 ID:U0YLx5iK.net]
- オウムさん餌でもついばんででください
- 707 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 15:45:49.48 ID:U0YLx5iK.net]
- 人間、いないねぇ…
- 708 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 15:59:10.40 ID:a1oB3JFl.net]
- 低収入オッサンやめろよ
ここはストレス発散のはけ口じゃないんだよ!!!
- 709 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 16:05:51.89 ID:U0YLx5iK.net]
- うん、ここはお前らの低能をなぐさめあう場所でもない。わかってるだろ?
- 710 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 16:06:40.12 ID:U0YLx5iK.net]
- あと、さすがに酔いがまわってきたから突然落ちるよ。
- 711 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 16:08:50.21 ID:a1oB3JFl.net]
- 低能低能いうけどお前レベル低いからな(笑)自覚しろよ!!!
- 712 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 16:11:06.58 ID:ZgIjL8Zc.net]
- 最初flock絡みでデッドロックやらかした時は
スクリプト止まらないしエラー吐かないしで何が悪いのか全然わからなくて立ち往生状態だった >>698 serializeほど楽じゃないが別途db用デーモンを起動させとかなくていいsqliteは便利 そういや手軽なdbの話じゃ最近berkeley dbの名前を全然見ないな…なんでだ
- 713 名前:デフォルトの名無しさん [2016/06/11(土) 16:11:26.13 ID:BbMy6dfc.net]
- PHP使ってるのなんてみんな底辺だから仲良くしようや
- 714 名前:668 mailto:sage [2016/06/11(土) 16:16:02.35 ID:0LrYNLoc.net]
- >>698
>>684 の情報により、fclose の前に flock($lock, LOCK_UN) を入れてね。 あと flock 使った排他で重要なところは、処理が終わってもロックファイルを消しちゃダメということ。 ロックファイルの存在確認式なんかだと処理が終わったらロックファイルを消す必要があるけど、flock式はそうじゃない。 同一のファイル(パスではなく inode)をオープンすることでロックをかけるから、消して作り直しても同じファイルにはならずその間でのロックがかからない。 あと、NFS 領域に対しては flock が使えない場合があるから、それは制限事項として覚えておいて。 といった具合に説明すると長くなるけど、コードはシンプルだから覚えておいて損は無いよ。
- 715 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 16:24:29.25 ID:ZgIjL8Zc.net]
- >>691
いや違う、falseを返すとかじゃなくてデッドロックを引き起こす 延々とロック取得待ち状態になってkillしなきゃいけなくなる
- 716 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 19:09:00.14 ID:U0YLx5iK.net]
- お前ら、人生楽しそうだな。
俺は頭痛い…
- 717 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 19:12:41.27 ID:U0YLx5iK.net]
- おっかしいな… なんでこんなに頭いたいんだ?
- 718 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 21:39:16.03 ID:vIdecit0.net]
- >>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";
- 719 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 22:15:24.50 ID:ZgIjL8Zc.net]
- >>715
すまんが712は単純に「LOCK_EXされたファイルへのLOCK_EX」の挙動を書いただけ flockの仕様から同一プロセスからの多重flockは後に指定したLOCK_**に上書きされるだけ、なのも確実(winは知らん) で、記憶掘り返しながらこっちでも試してみたけど>>715の言うとおり 同一プロセス内でも、別プロセスでも、fopen->flock->fclose->fopen->flock でデッドロックしなかった flock($fh, LOCK_EX)絡みでデッドロックになってハマった記憶が確かにあるんだがなあ…しかも1プロセスで 昔書いたソースとメモを読んでるけど該当箇所が見つからん
- 720 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 22:25:33.55 ID:U0YLx5iK.net]
- 具合悪い… 吐きそう…
- 721 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 22:43:11.56 ID:vIdecit0.net]
- >>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 したところから辿ってる。
- 722 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 22:53:40.15 ID:U0YLx5iK.net]
- 排他的に内容更新したいだけなのにお前ら何やってんだよ…
- 723 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 23:21:54.93 ID:u5pRtWh9.net]
- 僕の友達に「ゲームプログラムを兄から頼まれてよくやってるー」などと言ってる奴がいます。そいつにどんな言語使ってんの?とかきいてもいろんな言語使ってるから意識したことないわwとか誤魔化したり、c言語は難しくてよくわからんとか言っているのです。
なんか嘘くさいんで掘り下げてやろうと考えてます。 もしゲームプログラムするならこれは知ってて当然みたいな知識あったらそいつに仕掛けて反応見てみたいので教えてください。
- 724 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 23:27:06.01 ID:u5pRtWh9.net]
- 各場所間違えてました
ごめんなさい
- 725 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 23:36:10.98 ID:ZgIjL8Zc.net]
- >>718
そんな感じがしてきた。(だが718のコードだと$lockを上書きしちゃってるからデッドロックは起きない) 同一のファイルを二重に開いて別々にファイルハンドルを保持し別々にflockしたとき 片方だけでもfcloseしたら両方LOCK_UNされることの対策か、とも思ったけど 実際に下記を手元のwin-5.2.0とlinux-5.1.6とlinux-5.6.8で試してみたら、どうも違うようだ $file = './flock.lock'; $fh1 = fopen($file, 'a'); flock($fh1, LOCK_SH); $fh2 = fopen($file, 'a'); flock($fh2, LOCK_SH); fclose($fh1); $fh3 = fopen($file, 'a'); flock($fh3, LOCK_EX); // いずれもここでデッドロックが発生 わからん
- 726 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 23:46:33.60 ID:vIdecit0.net]
- >>722
上書きしてるから起こるんだよ、オブジェクトみたいに変数上書きしたら参照が無くなった方が勝手に破棄されるんじゃないから。 でも本質は、一つのハンドルには何度繰り返しロックをしてもスルーされるけど、一つのファイルでも別個の 2つのハンドルを取得しちゃった場合、 その両方にロックを掛けたらそりゃ 2度目の方はブロックされるという点。 意図せずこのバグを引き起こすケースとしてはこんな感じじゃね。 $lock = fopen('lock','a'); flock($lock, LOCK_EX); <なんかの処理、でもうっかり $lock の値を壊してしまう> fclose($lock); // ロックを解放したつもりだけど、$lock が正しいハンドルを示していないから失敗、ハンドルリーク $lock = fopen('lock','a'); flock($lock, LOCK_EX); // 二度目のロック、同じファイルだけどさっきのロック取得済みのハンドルとは別ハンドルになるからロックを取得できない :
- 727 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 23:50:10.54 ID:vIdecit0.net]
- >>723
ごめんうそ言った。 ハンドルを上書きしたらクローズされてるみたいね? なので >>723 は忘れて。
- 728 名前:デフォルトの名無しさん mailto:sage [2016/06/11(土) 23:57:31.23 ID:ZgIjL8Zc.net]
- >>724
気にすんな しかしこうなると真面目に手動LOCK_UNの意味・有効な場面がわからなくなってくるな というかfclose/flock仕様変更の前後の差異がわからん
- 729 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 04:10:30.87 ID:p2hTIoUv.net]
- 懐かしい話を掘り起こしているようで
tumblr.tokumaru.org/post/37141017115/
- 730 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 04:35:52.53 ID:jxNAYoxL.net]
- オブジェクト指向はアクセス指定子や抽象クラスなどで
やってはいけないことや守るべきことをコードの中で示すことができますが フォークすることによって起きる事態に対しては無力だと思います たとえば、プロセスidを入れ込んだファイルパスは、 その都度getmypidを呼んで生成しなければいけない、 というようなことを、コードのシンタックスによって示すことは出来ませんよね コードのどこかでフォークしているということに気付かずに いちいち毎回作り直さずにキャッシュすればいい、と思うことはありそうです いい方法はないでしょうか?
- 731 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 07:55:29.22 ID:4xmbllsr.net]
- >>726
参考になった。ありがとう。 でもこれ、system関数のバグなんじゃね? 内部で fork した後、親プロセスから継承したハンドルを閉じてないんじゃ? そこのデッドロックのサンプルだと、デッドロック中はロックファイルの lsof は子プロセス側に 2件ある。 5.3.2 での改修ポイントが間違ってたんじゃないのかなぁ… 少なくとも OS のシステムコールレベルではハンドルを閉じればロックも否応なく外れちゃうし、これは Unix系も Windows も一緒なはずだが。
- 732 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 08:18:59.24 ID:4xmbllsr.net]
- 検証した。
やっぱ子プロセスが継承したハンドル持ちっぱなしだよ。 当然マルチプロセスの処理を書く時にはそれを意図的に利用したいことはあるけど、PHP だったら内部で exec系を行う前にはスクリプトで開いたハンドルは全部クローズするべきなんじゃないのかね。 ただ現象が起こる理由は分かったから、それに基づけば明示的なアンロックが無くても影響があるところはほとんど無さそうだと判断するけどな。
- 733 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 13:06:26.58 ID:0JopogCG.net]
- そもそもflockシステムコールはもともとマニュアルに書いてあるように
flock() によって作られるロックは、 オープンファイル記述 (open file description) (open(2) 参照) と 関連付けられる。 したがって、ファイルディスクリプターの複製 (fork(2) や dup(2) などにより作成 される) は同じロックを参照し、 これらのファイルディスクリプターのどれを使っても このロックを 変更したり解放したりできる。 また、ロックの解放は、 上記の複数のファイルディスクリプターの いずれかに対して 明示的に LOCK_UN 操作を指示した場合か、これらのファイルディスクリプターが すべて 閉じられた場合に行われる というもので、phpのfclose関数の中でわざわざLOCK_UNしてたのは余計なお世話 で本来の動作を阻害していたから5.3.2でやめたって理解でいいんだろうか。
- 734 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 13:26:47.31 ID:4xmbllsr.net]
- >>730
うん、よくよく考えると > というもので、phpのfclose関数の中でわざわざLOCK_UNしてたのは余計なお世話 ということが正しいと思う。 元々マルチプロセスなプログラミングで自動で複製されるファイルディスクリプタの扱いはプログラマが意識する必要があって、複製の後始末をせずにロックが残ることがあるのはそもそも設計ミス。 こういうことをフォローするために PHP では fclose でのついでに自動でアンロックが走るようにしていたけど、そうると親子プロセスの一方で不要になったディスクリプタを閉じただけでロックまで外れちゃうという問題を引き起こす。 だったらリソースの管理はやっぱりプログラマに任せるって判断が妥当なんだろう。 互換性の点でも、そもそもディスクリプタの複製が行われるケース(恐らく PHP では fork を伴う何か)と関係無ければ fclose だけでロックは解放されるから問題は無いし、 複製が行われるような処理ではアンロックの必要性についてはプログラマが意識していてしかるべきだから、 結局のところ fclose にアンロックを合わせこむのをやめるのが正解だな。 ただ system をはじめとするシェル系の関数は気軽に使いがちだから、子プロセスのハングアップでロック残りが起こる可能性は身近かもしれないね。 これまでアンロックせず動いてたスクリプトを無理やり改修する必要までは無いけど、これから書くならアンロックは明示しとけってことだな。 久々に勉強になった。
- 735 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 14:20:54.54 ID:QWuFqOwW.net]
- >久々に勉強になった。
使う機会あるといいけどな。
|

|