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分以内に立たない場合、宣言してから立てたい人が立てること。
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] >久々に勉強になった。 使う機会あるといいけどな。
736 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 14:39:38.95 ID:Y/PMYUAu.net] 別に子プロがハングしようとLOCK_UNには関係ないんじゃないか execしたphp以外のプロセスがロックしててもphpのロックには関係ないし どんなプロセスでもプロセスが終わればロック解放されるんだから
737 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 15:10:09.70 ID:3j0TR14y.net] >>733 ハングして終了しなければ殺すまでロックしっぱなしだろ
738 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 15:21:03.49 ID:3j0TR14y.net] 説明が足りないか。 PHPでファイルを開きロックをした状態で、例えば system で別プロセスを起動したとする。 このプロセスは、PHP で開いていたファイルディスクリプタの複製を持つ。 ディスクリプタが複製されても取得しているロックはひとつで、このディスクリプタのいずれかでアンロックすればロックは解放される。 誰もアンロックしなかった場合、そのロックに紐付く全てのディスクリプタが閉じられた場合に解放する。 つまりディスクリプタの複製を持った子プロセスがそれを閉じないままハングした場合、親プロセスがディスクリプタを閉じてもロックは解放されず、子プロセスを殺すまでロックされたままになる。 ちなみに子プロセスがPHPかどうかは関係無い。
739 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 15:29:21.61 ID:jxNAYoxL.net] ファイルパスを正規化するにはどうすればいいですか? realpathで出来ると思っていたのですが まだファイルが存在しない時点では結果がfalseになるので駄目でした
740 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 16:09:50.68 ID:hcrF9o1u.net] >>736 標準関数にはない。 Packagistには恐らくあるだろう。
741 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 17:23:27.51 ID:jxNAYoxL.net] >>737 ありがとうございます packagistというところから辿ったらありました https://github.com/perchten/php-truepath/blob/master/src/truepath.php
742 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 17:28:53.54 ID:pWHiM9s7.net] とりあえず話が収束したらまとめとして残してくれる? ここまで議論しといて残さなかったらPHPerとして恥だし
743 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 17:51:52.67 ID:SdG9GRKe.net] 他力本願こそPHPerとして恥だぞ
744 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 18:52:27.13 ID:Y/PMYUAu.net] >>734-735 あるファイルをphpで有効にLOCK_EXしても別プロセスで起動したviには何も影響しないと認識していたが? だからphp以外をexecしてロックが生じてもphpの記述には関係がない=fclose前のLOCK_UNに関係ない ある.php内であるいはexecで呼び出した.phpでファイルロックが起きてもmax_execution_timeの縛りで強制終了すればロックは解ける ゆえに「ロック残り」とやらで掴みっぱなしになることはそうそうない、そう認識していたんだが
745 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 18:52:38.31 ID:QKWa7och.net] で、お前らぴーえいちぱーって読んでんの?
746 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 19:03:36.38 ID:4xmbllsr.net] >>741 flock によるロックって別のプロセスからのファイルアクセスを禁止するわけじゃないから。 同時にロックを取得できないだけであり、それによって「ロックを取得しようとするプロセス同士」を排他するわけ。 ロックを取得しようとしないプロセスはロックされたファイルであろうとアクセスし放題だよ、例えば vi とかね。 Windows では他のプロセスからのファイルアクセスを禁止することもできるけどな。
747 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 19:06:30.53 ID:QKWa7och.net] ピーチクパーチク、ピーエイチパーチク ヨー、チェケラッチョー
748 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 19:15:10.09 ID:Y/PMYUAu.net] >>743 あれviってflock使ってなかったっけ?まあいいや他のなんでもいいんだが 本旨はphpにおける明示的flock($lock,LOCK_UN)の必要性だろう、それが他プロセスとどう関わるんだ 結局どういうときにLOCK_UNしないと「ロック残り」が起こるんだ
749 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 19:35:01.71 ID:4xmbllsr.net] >>745 >>726 の実験コードで再現できるよ。 デッドロックのメカニズムはこう。 まず a.php でファイルを開き、ロックする。 そして system で b.php を開く(別に PHP である必要は無い)。 この段階で b.php は、a.php が開いていたファイルの fd(ファイルディスクリプタ)の複製を継承する。 b.php は継承した fd とは別に自前でファイルを開き、ロックしようとする。 ロック済みのファイルに対してロックしようとするから、これはブロックする。 この間 a.php は処理が進み、fclose が走る(*1)。 プログラマーの意図としてはここでロックも自動的に解放されると思っているが、このロックを共有する fd を b.php が閉じずに持っているので、まだロックは解放されない。 a.php は終了するがロックは解放されないので、b.php のブロックが解けることも無くデッドロックする。 このスクリプトをデッドロックさせずに走らせるためには、*1 の前に LOCK_UN するのが一案(PHP においては唯一の手段)。 これにより b.php は継承した fd を開かれたまま持ってはいるが(ある種のリソースリーク状態)、ロックは a.php により解放されるので、b.php が自分で開いた fd に対するロックを取得でき、処理が進行する。 もう一案は、PHP では実現不能だと思うけど、b.php が走り出した直後に継承した fd を閉じること。 PHP からは継承した fd の存在が見えないし、fd を知ることができたところで何もできないから詰むけど、fd を操作できる処理系ではそれが可能だし、むしろ常套手段。 ようは、何かのファイルをロックしたまま子プロセスを立ち上げ、その子プロセスが同じファイルのロックを取得しようとするかなり限定されたケースでは LOCK_UN が必要。
750 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 19:43:46.46 ID:4xmbllsr.net] ついでにもう少し、>>746 のようなケースであれば、5.3.2 よりも前のように flose で LOCK_UN してくれりゃいいじゃんと思うかもしれない。 多分 PHP の設計者もそう思って、そうしていたんだろう。 でも pcntl_fork なんてことができるようになると、それじゃ問題が出るケースにぶち当たる。 通常 fork してもやっぱり親が持っていた fd は子プロセスに継承されるし、pcntl_fork に関して言えば継承された fd はファイルハンドルの形で PHP から操作できる状態で見えている。 通常マルチプロセスの処理は、親が持っていた fd はじめいろいろなものを継承してしまうので、子にとって不要なものを閉じてしまうというのが最初にやること。 親がロックを取得した fd をそのまま親と子で共有するなんてことはめったに無いから、親なり子なりでその fd を閉じる処理を書くことになる。 この時 LOCK_UN が自動的に走るようになっていると、そのロックを必要としている方のプロセスが持つロックまで解放され、非常に具合が悪い。 だから fclose で勝手に LOCK_UN するなんてのは余計なお世話以外の何物でもない。 というわけで、fclose で LOCK_UN しないようになったと、こういうことだよ。
751 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 19:49:34.59 ID:4xmbllsr.net] >>747 > 親がロックを取得した fd をそのまま親と子で共有するなんてことはめったに無いから、親なり子なりでその fd を閉じる処理を書くことになる。 ちょっと誤解を招くかもしれないから捕捉。 親がロックを取得した fd をそのまま親と子で共有するなんてことはめったに無いから、 その fd はどちらか一方にとっては不要であるから、そちらのプロセスでは最初にその fd を閉じる処理を書く。
752 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 19:58:20.79 ID:p2hTIoUv.net] >>745 プロセスが生きている間においては「ロック残り」が発生するが、どうせ死ぬから問題ないというスタンスだとすれば、 max_execution_timeを0にした場合や、(初期値が0である)CLIの場合は生き続けるよ。
753 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 20:37:09.64 ID:SRdEl8UG.net] HTMLとは ハイパー テキストマークアップ ラングアゲ
754 名前:デフォルトの名無しさん mailto:sage [2016/06/12(日) 21:40:22.72 ID:ETS5lku+.net] ランゲージ
755 名前:デフォルトの名無しさん mailto:sage [2016/06/13(月) 09:32:27.21 ID:Mgx0zrpD.net] 今phpをステップ実行できるデバッガで便利なのってどのあたり? ステップごとにそれぞれの変数の中身がどうなってるか簡単にわかるとうれしい
756 名前:デフォルトの名無しさん mailto:sage [2016/06/13(月) 13:49:19.06 ID:XIduanRK.net] array_filterで関数に他の引数も与えたい場合はどうしたらいいですか?
757 名前:デフォルトの名無しさん mailto:sage [2016/06/13(月) 14:23:37.32 ID:TYgkMCrQ.net] >>753 コールバックにオブジェクトメソッドを指定して、オブジェクトに他のパラメータを持たせるとか?
758 名前:デフォルトの名無しさん mailto:sage [2016/06/13(月) 14:36:57.48 ID:TYgkMCrQ.net] あんまやったことないけど、クロージャでやる方が簡単なのかね? function my_array_filter(array $input, $param) { return array_filter( $input, function($var) use($param) { return $var <= $param; } ); } $a=array(1,2,3,4,5); print_r(my_array_filter($a, 2)); print_r(my_array_filter($a, 4)); <実行結果> Array ( [0] => 1 [1] => 2 ) Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
759 名前:デフォルトの名無しさん mailto:sage [2016/06/13(月) 15:15:41.61 ID:XIduanRK.net] >>755 phpもクロージャ出来るようになってたんですね ありがとうございます
760 名前:デフォルトの名無しさん mailto:sage [2016/06/13(月) 16:04:29.44 ID:poUAr+t+.net] Array→アレイ→アレ?→あれれ? という発想が頭から離れなくて頭が基地外になりそうなんだけどプログラミングは向いてないよね? ちなみに仕事はPG全く関係なくて異業種の作業員
761 名前:デフォルトの名無しさん mailto:sage [2016/06/13(月) 18:18:38.79 ID:Mj2HqjrQ.net] おでかけですか〜?
762 名前:デフォルトの名無しさん mailto:sage [2016/06/13(月) 18:53:18.04 ID:I48wzFwG.net] おまえら、平和でいいな。
763 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 00:37:10.95 ID:e/1BDrQk.net] >>757 電気屋さんとか電波屋さんと仲良くなれそう
764 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 02:04:02.36 ID:vpCPShaK.net] 配列をオブジェクト指向的に使うための組み込みクラスは何故ないのでしょうか?
765 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 03:26:27.75 ID:E92ohJVI.net] ないんですか?
766 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 03:29:28.98 ID:sdXnBDtj.net] >>761 当初はあまりオブジェクト指向じゃなかったという点と、 現状の array をそのままオブジェクトとして見なす変更をしてしまうと array を関数の引数に取る場合に他のオブジェクトの扱い(array はコピー渡し、オブジェクトは参照渡し)と一貫性が取れなくなるから、今更どうにもできないってところじゃね。 それより、関数が返す array を直接添え字でアクセスできないのをなんとかして欲しい。 ようは explode(',', $str)[1] みたいにやりたいわけだが、この改修ならほとんど問題無くできそうな気がするけどな。
767 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 03:34:56.83 ID:pjhL6UK+.net] list(,$test)=explode(',', 'test1,test2,test3'); こうするのがせいぜいだが、これで妥協するか自分自身が開発に参加して改修するかだな
768 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 03:48:41.99 ID:E92ohJVI.net] できないんですか?
769 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 05:18:59.07 ID:jLlAbvBE.net] ArrayObjectとArrayIteratorならあるぞ
770 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 09:39:15.99 ID:1o9WExv+.net] >>761 実装済みの>>766 に加えて自前クラスでもArrayAccessインターフェイスを実装すれば配列のように扱えるクラスを実装出来る
771 名前:デフォルトの名無しさん mailto:sega [2016/06/14(火) 10:25:21.42 ID:ekIyBZy6.net] PHPStorm を優勝期限切れで使い続けてる人います? バージョンアップできなくてつらくない?
772 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 11:58:51.69 ID:vpCPShaK.net] ありがとうございます ArrayObjectってあったんですね 探し方が足りなかったようです やはり関数言語的な書き方をしようと思うと、生配列だと物足りなくなってきますね ただArrayObjectも、関数言語的なメソッドは実装されてないようです eachやmapやreduceなど 既にそういうの書いてる人はいるでしょうけど、 標準実装してほしいところです
773 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 12:23:57.32 ID:nAMCA7y/.net] >>763 explode(',', $str)[1] については いつまでも古いバージョンのPHPつかってんじゃねーよってことだが。
774 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 17:44:21.80 ID:vpCPShaK.net] class ArrayObjectEx extends ArrayObject { public function map($func){ foreach ($this as $key => $value){ $this[$key] = $func($value,$key); } return $this; } } とりあえずmapを作ろうと上みたいな感じにしたのですが インスタンスのmapを呼び出すとundefined functionと言われます 親クラスにないメソッドを追加することは出来ないのでしょうか? だとしたらそんな制限は意味が不明すぎますが・・
775 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 19:05:12.07 ID:4d00OzM8.net] 検証すんのめんどくさいから全部コード乗っけてくれる?ハゲ
776 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 19:26:39.01 ID:E92ohJVI.net] mapに何を渡したんですか?
777 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 21:39:45.32 ID:vpCPShaK.net] 失礼しました あまりの非PHPっぽさに釣られて $a.hoge(); みたいな書き方をしていました
778 名前:デフォルトの名無しさん mailto:sage [2016/06/14(火) 23:57:10.36 ID:sdXnBDtj.net] >>770 あれ本当だ いつの間にこうなった
779 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 00:30:10.47 ID:yBESscco.net] >>775 5.4からだから既に4年以上前
780 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 01:15:30.82 ID:/9sc4puR.net] explodeの戻り値がfalseだったら文字列でもfalseでもない null が返ってくることになるよな、それ noticeも出る
781 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 02:58:03.10 ID:6YnDO2OY.net] そうですね
782 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 09:56:12.92 ID:35n6X8km.net] >>776 ずっとそれ出来ないもんだと思ってた...
783 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 10:18:18.00 ID:HJSiSv4s.net] 猿は勉強しないから知らなくても無理はない。気にすんな。
784 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 11:45:48.59 ID:DNtAqMfa.net] わかった。 もう気にしない。
785 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 12:28:52.64 ID:63gxNX9v.net] マイナーバージョンアップで使えるようになった書き方は互換性の面で正直使いづらいな。 使いやすくなることは喜ばしいが。
786 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 14:10:09.61 ID:i5XubNZf.net] 自分の書いたコードが PHPのどのバージョンから使えるコードなのかを判定する ツール的なものはないのでしょうか?
787 名前:デフォルトの名無しさん mailto:sage [2016/06/15(水) 14:13:56.64 ID:x+vvrMaZ.net] 言い出しっぺが作るのです
788 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 03:33:03.54 ID:F+lw57im.net] readdirでディレクトリエントリを読んでいきながら 便宜ファイルを削除しても問題ないのでしょうか?
789 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 11:12:05.38 ID:F+lw57im.net] stackoverflow.com/questions/13507721/how-to-delete-a-file-from-folder-in-php ここを見ると問題ないようです foreachで元の配列を破壊的に変化させてるようなものだと思うのですが どういうアルゴリズムなのか。 一旦全てエントリを舐めて、一つ一つ取り出してるだけなのでしょうか scandirではなくreaddirを使うのはメモリを節約したいという意識からですが 一度に全部読んで単に取り出しを一つ一つしているだけなら あんまり意味がないですね
790 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 11:51:44.03 ID:OOtzbp5n.net] >>785 問題が出るかは確認してないけど、 問題が出るかもしれないから readdir のループでは対象ファイルのリストアップだけして、改めて処理用のループ回してる。
791 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 15:13:15.23 ID:rO3o63UR.net] 配列の操作について質問です。 MySQLから点数データを取得してwhile文で配列に格納するとともに、 点数の5段階の相対評価を得たいです。 学生(要素数が可変)の点数配列scoresがあるとした場合、点数の高い順に 最初の1/5をA、次の1/5をB、次の1/5をC、次の1/5をD、残りをEに分類するには どういう操作をするのが定石でしょうか?
792 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 15:14:35.80 ID:rO3o63UR.net] (続き) やりたいことは点数出力時に、「相対的」に5段階評価してランク付けも出力したいのです。 絶対評価なら80点以上はA、60点以上はB・・・など基本的なif文の分岐で可能ですが、 相対評価の場合に、定石的な方法や、便利な関数などはあるのでしょうか? いったん点数を配列に格納後に、配列をコピーしてソートして5つに分類するとか考えているのですが、 もっといいアルゴリズムや便利な関数などありますか? よろしくお願いします。 配列の中身(MySQLからwhile文で取得) scores[1] = 19; scores[2] = 82; scores[3] = 37; ... scores[488] = 11; scores[489] = 55;
793 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 15:20:11.03 ID:lOAG9aOi.net] >>788 ここはphpの下質スレですがご質問はphpに関する質問ですか?
794 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 15:25:56.10 ID:rO3o63UR.net] >>790 はい。 PHPでのアルゴリズムの実装方法やそのためのPHPの関数などを教えて欲しいです。
795 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 15:32:21.65 ID:F+lw57im.net] >>787 それが安心ですね ありがとうございます
796 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 15:40:54.97 ID:lOAG9aOi.net] >>791 まあ…ほんとにphpなら 単純に1次元配列を並び替えるだけならrsort($scores);するかその前にsqlの時点でORDER BYすればいい あとは$scores = array_chunk( $scores, (int)(ceil(count($scores)/5)) );とかすればいい データが二次元だとか細かい処理したいとかならrsort()ではなくusort()も使える
797 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 16:28:58.79 ID:rO3o63UR.net] >>793 ありがとうございます。 配列操作の関数がたくさんあってどれが最適なのか見つけられずにいました。 ORDER BYとご教示頂きましたarray_chunkの関数の組み合わせが最適そうですね。 解決できそうです。ありがとうございました。
798 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 16:49:55.80 ID:BCCkDo9p.net] 学生数が5できっちり割れる時は良いけど そうならない時はどうするのかな?
799 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 17:36:01.49 ID:rO3o63UR.net] >>795 ご注意ありがとうございます。 array_chunk には、次の記述がありますが、仕様上問題ないです。 「最後の部分の要素数は size より小さくなることもあります」 php.net/manual/ja/function.array-chunk.php
800 名前:デフォルトの名無しさん [2016/06/16(木) 21:36:32.86 ID:geCt37Iz.net] 質問させていただきます。 Class内でメンバ関数で定義した変数を別のメンバ関数から参照するにはどうすれば良いのでしょうか?
801 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 22:26:42.88 ID:S7gZdFkC.net] >>797 何がしたいか分からんからやりたいことのコード例
802 名前:デフォルトの名無しさん [2016/06/16(木) 22:30:00.80 ID:geCt37Iz.net] >>798 あ、ごめんなさい class { public function a() { $x = 'hello,world'; } public function b() { print $x; //hello,worldを表示する } } 簡潔にかけばこんな感じです。 aメソッドで定義した変数をbでも使いたいです
803 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 23:17:55.32 ID:S7gZdFkC.net] >>799 クラスのプロパティにしたらあかんのか?
804 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 23:23:33.51 ID:OOtzbp5n.net] クラス内の特定の機能だけでしか使わない変数の扱いについては悩ましいこともあるな。 スコープを厳格にしたいならその機能を別のクラスとして切り出すか、そこまで小分けしたくないなら大人しくプロパティにしてしまうか。 JAVAなんかだとクラス内クラスが簡単に扱えてこういうのに便利なんだけど、PHPってどうなんだっけ。
805 名前:デフォルトの名無しさん [2016/06/16(木) 23:23:34.81 ID:geCt37Iz.net] >>800 まあそれでもいいっちゃいいんですけど ちょっとコードが長くなった時とか、別々にして処理させたいんですよね 皆さんがクラス書くときってどうやってるんでしょうか
806 名前:デフォルトの名無しさん mailto:sage [2016/06/16(木) 23:30:35.19 ID:S7gZdFkC.net] >>802 そもそも担当処理が違うなら別クラスにして委譲するのが適切だとは思う
807 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 00:04:23.57 ID:OWOb/yaE.net] public function a() { static $x = 'hello,world'; } これでは要求を満たさないならばおとなしく関数ではなくclassの変数やclass定数にすべき
808 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 01:04:47.60 ID:bXZXch1T.net] >>804 質問を読んでなんでそんなコードが出てくるのか意味解らん
809 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 01:24:40.23 ID:VvmzJV5D.net] 配列から数をキーとして持つ要素だけを取り出す いい方法はありませんか?
810 名前:デフォルトの名無しさん [2016/06/17(金) 02:24:59.62 ID:Ub5TQFWS.net] PHPの本で分かりやすいのある?
811 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 07:28:42.66 ID:yged7CRH.net] >>807 皆さんはどんなosでどんなツールでphpやっているの? 教えて
812 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 07:38:35.18 ID:kypwTnD/.net] 机の上でノートに鉛筆でコードを書きながら脳内デバッグして脳内リリース。
813 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 07:55:00.51 ID:zTp2v+lf.net] >>809 奇遇ですな。 同じくアイデア段階では、パソコンでやらずに紙です。 すぐにフローやイメージ図を書き留められる。放射状に広げていける。 紙とエンピツがその時だけ本当に便利だよね。
814 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 08:36:09.46 ID:CYdk5Mt/.net] シーケンス図は手書きの方が楽、人に見せるときは格好つけてVisioで整形するがな
815 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 10:05:23.41 ID:izLNj4Mm.net] >>807 山田祥寛(よしひろ)、翔泳社 10日でおぼえる PHP 入門教室、第4版、2012 この本は、Webアプリ作成の流れがわかるけど、 文法の説明は、あまりない
816 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 10:10:12.64 ID:zTp2v+lf.net] >>812 その人の本地雷だろ。 初心者の時にPEARの本買ったら、意味がわからなくなって挫折しかかった。 別の本で救済された。文法云々の前にとにかく、理屈をこねすぎて本質部分全然わかりにくい。
817 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 10:56:59.01 ID:izLNj4Mm.net] 山田祥寛は第一人者。 様々な言語の本を書いている。RoRでも有名 講習会も1日4万円!
818 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 11:50:18.31 ID:1vjuVThu.net] >>806 array_filter() で ARRAY_FILTER_USE_KEY フラグを使ってフィルタリングする。 あるいは、foreach で順に走査して該当するものだけ取得する。
819 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 13:12:30.73 ID:VvmzJV5D.net] >>815 ARRAY_FILTER_USE_KEYというのは初耳でしたが、 借りたVPSに入ってるのは5.4なので、まだ使えませんでした おとなしくforeachします ありがとうございました
820 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 16:07:38.77 ID:AeewtahV.net] ユーザーアイコンの取得方法について質問です。 現在ユーザーアイコンの保存にてaws s3(フレームはlaravel)を利用しています。 疑問なのはアイコンの存在チェックをするべきかどうかです。 (アイコン名はユーザーのid名です) 以下のようにすると、存在チェックと取得の計2回のリクエストが発生してしまいます。 @if (Storage::exists('user-icons/' . $user->id . '.jpg')) <img src=&quo
821 名前:t;{{ Storage::url('user-icons/' . $user->id . '.jpg') }}"> @else <img src="{{ Storage::url('user-icons/default.jpg') }}"> @endif そのため単純にユーザーが会員登録した時点でデフォルト画像をユーザーアイコンとして保存し 以下のようにただ取得するというシステムにしようか迷っています。 <img src="{{ Storage::url('user-icons/' . $user->id . '.jpg') }}"> (アイコンを変えないかぎり、ストレージ上ではデフォルト画像があふれるような感じ) アイコンを設定するようなサービスは、どのような構造になっているのでしょう? [] [ここ壊れてます]
822 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 16:09:49.84 ID:KYjoOhmA.net] >>817 データベースは使わないの?
823 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 16:40:23.10 ID:AeewtahV.net] >>818 アイコン変更履歴を格納するという意味でしょうか?
824 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 16:56:34.53 ID:KYjoOhmA.net] >>819 履歴が必要なら履歴も登録してもいいけど。 例えば、user.iconに画像ファイル名が入ってるなら、 select cese when user.icon is null then 'default.jpg' else user.icon end as user_icon 画像ファイル名じゃなくて、あり/なしでもいいし、フルパスにしてもいいし、 userとは別テーブルにしてもいいし。
825 名前:デフォルトの名無しさん mailto:sage [2016/06/17(金) 16:58:19.35 ID:KYjoOhmA.net] っていうか、 > 以下のようにすると、存在チェックと取得の計2回のリクエストが発生してしまいます。 これほんと? $user->idってインスタンスのプロパティアクセスじゃないの?
826 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 00:14:26.11 ID:SEe9xJ4I.net] >>817 ファイルを保存したことが確定していればそれでいいというのであればそのステータスをローカルのDBなんかに保存する アクセス時点でクライアントに画像が見えることを担保したいのであればクライアントサイドでやるべきではないか
827 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 00:48:21.29 ID:W3J+GEBP.net] >>821 の > これほんと? しかまともなレスがない
828 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 03:06:39.83 ID:zkudPs4r.net] >>823 つかそいつ一人しかレス付けてないじゃん。 >>817 S3 は高性能なストレージで存在チェック程度のアクセスは気にするような話ではないんじゃない? ただアイコンを表示する全ての個所でそのコードを書くのはだるいから、デフォルトアイコンを作ってしまうというのもアリだと思う。 ただそうすると、例えばアイコンを設定してないユーザー 10人を一覧表示する場合、 存在チェック式なら同一の画像URL 10個が並ぶからクライアントは結果的に 1回の画像取得しかしないのに対し、 デフォルトアイコンコピー式では画像は個別の 10 の URL になるからクライアントは 10回画像取得をすることになり、 存在チェックなどの些細な負荷より重い実際の画像アクセスが増えてしまう。
829 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 08:33:50.00 ID:8GpUPXrh.net] >>817 ファイルリストをキャッシュしておいて ファイルが変更された(画像ファイルの追加や削除)タイミングで キャッシュをInvalidateすればいいんでないかい?
830 名前:デフォルトの名無しさん mailto:sage [2016/06/18(土) 08:42:32.00 ID:saT7WdS7.net] default.jpgくらいは手元(ローカルサーバー)に置いておきたいというのはあるわな その場合はlocal://default.jpgとかs3-icon://xxxx.yyyみたいな独自書式を用意するかな