【PHP】下らねぇ質問はID出して書き込みやがれ 114
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2012/01/02(月) 02:03:25.50ID:???過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。
◆前スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 113
http://kohada.2ch.net/test/read.cgi/php/1322564127/
◆質問用テンプレ
【OS名】CentOS
【PHPのバージョン】5.3
【連携ソフトウェア】MySQL ImageMagick
【質問内容】
◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
(PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。)
◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0622nobodyさん
2012/01/11(水) 13:15:03.58ID:???マニュアルを読まないのが原因です
0623nobodyさん
2012/01/11(水) 13:27:59.44ID:eyRErrPBありがとうございます
http://php.net/manual/ja/function.session-set-cookie-params.php
を見てるんですが、
「すべてのサブドメインでクッキーを有効にしたい場合は、先頭にドットをつけて '.php.net' のようにします。」
とあるようにサブドメインの変更までなら対応できるのではないですか?
0624nobodyさん
2012/01/11(水) 13:30:15.06ID:???0625nobodyさん
2012/01/11(水) 13:36:51.45ID:???そのブログの設定ファイルがphp.iniより優先するということでしょうか
実はちょうど今session_set_cookie_params();で対応できたんですが
そちらの勉強もしてみます
ありがとうございました
0627nobodyさん
2012/01/11(水) 14:07:42.61ID:VbJoExbW皆さんはPHPにて「並行処理」をしたい場合、どのようにされていますでしょうか?
自分がやりたいのは、あるスクリプトがあり、それを引数(設定値)だけを変えて
決められた時間の間隔にて(sleep()等を使って)繰り返し、大量に(少なくとも20位)かつ”同時に”実行したいと思っております
子プロセスの同期は必要ないと思います
ファイルをコピーして、各スクリプト毎に設定値を書いて・・・って言うのは現実的ではないので
データベースなどからリストを取得して、その設定値を使ってそれぞれを同時に実行したいと思っております
(fwrite()などで、設定毎にスクリプトを作成していこうかとも考えましたが・・・)
しかし色々考えたのですが、全然いいアイデアが浮かんできません
このような場合、どのようにすればいいのでしょうか?
0628nobodyさん
2012/01/11(水) 14:08:07.06ID:VbJoExbW$list = array(~DBからの設定値~);
$pid = pcntl_fork();
if ($pid == -1) {
die('ダメ');
} else if ($pid) {
pcntl_wait($status);
} else { //子プロセス
foreach(~$list~)とかイテレータ{
system()とか
}
}
上記のようにforeach()で回してしまうと、設定値を読み込んだ順に実行されていくので
普通のイテレータ使ったスクリプトと同じで、並列処理にはならないように思います
それともforeach()をif()の外で回して配列に格納しておいて、$iという数字をインクリメント
した後に子プロセス内にてfor()にて一気にsystem($list[$i])等で実行すればいいのでしょうか?
>>627のような実装をしたい場合に何かアドバイスを頂けないでしょうか?
0629nobodyさん
2012/01/11(水) 14:20:29.14ID:???0630nobodyさん
2012/01/11(水) 15:00:30.88ID:???foreach ( $list ... ) {
if ( ($pid = pcntl_fork()) === 0 ) {
子でやりたいこと
exit(0);//終わる
} else if ($pid == -1) die("x");
}
//親での処理(終わるの待つとか)
0632nobodyさん
2012/01/11(水) 15:25:25.54ID:VbJoExbW自分のやりたい事とは少し違いますが、説明が簡単な例としては、Googleのクローラなんかがあると思います
データをどういう手法か分かりませんが、初期のものでも1サーバに300ものクローラを使っていたとの事です
クローラは動き回っているので考え方が違うかもしれませんが、例えば自社や関連会社のデータなど固定されたターゲットの場合はcronなどで定期的に訪問出来るでしょうが、
それらの設定値をいちいちファイルに記述するのも大変なので、それぞれの場所にてデータを取得するためのxPathなど設定値リストを読み込んで、
スクリプトにて一気に並行処理にて自動的に行う、という事をやりたいと考えております
ただ、アクセスし続けるのも相手側に付加がかかるので、各スクリプトの訪問間隔を大きい相手は5分、小さい相手は1時間などにしたいと考えております
また、それらのデータを正常に取得したら、その瞬間に今度はそのデータを解析・整形するようなスクリプトを起動させたいと考えております
以上の点にて宜しくお願いいたします
0633nobodyさん
2012/01/11(水) 16:03:46.74ID:???取得先が大量にあって直列処理だと時間がかかりすぎるしそれぞれ取得設定を書くのもめんどいから
並列にしたいってことでおk?
ならcURLのマルチ使って、設定値をdbなどから引っ張ってきてから
回しながらcallbackなんかをうまく設定して一気にゴー、で行けるんじゃないか。
やりたいことと違っていたならすまん。
参照:ttp://techblog.ecstudio.jp/tech-tips/php-multi.html
0635nobodyさん
2012/01/11(水) 16:46:00.24ID:???PHPは標準で並列処理できない仕様だ。
並列処理できる言語、並列処理できるソフトを使って保存してから
PHPでそこにアクセスしたら良い。
0636nobodyさん
2012/01/11(水) 16:58:01.39ID:???通信だけは並列にできるいうことだが。クローラーはパフォーマンスを落とさずに、並列処理可能な言語・ツールに並べる可能性はある。
0637nobodyさん
2012/01/11(水) 17:09:13.29ID:???0638nobodyさん
2012/01/11(水) 17:40:57.15ID:???0639nobodyさん
2012/01/11(水) 17:43:06.65ID:???のコンパイルは結局うまくいったのか?
0641nobodyさん
2012/01/11(水) 18:17:50.79ID:???0642nobodyさん
2012/01/11(水) 19:03:57.60ID:???0643nobodyさん
2012/01/11(水) 19:05:55.41ID:???0645nobodyさん
2012/01/11(水) 19:31:49.93ID:???0646nobodyさん
2012/01/11(水) 20:04:08.13ID:???for ($i = 0; >>643の心が折れるまで; $i++) {
$result[] = kokuhaku($list[$i]);
}
if ($result == NULL){
die("まだ2次元がある");
}
0647nobodyさん
2012/01/11(水) 20:48:30.27ID:tHZDD+V0hoge.txtというテキストファイルがありまして
100バイトの文字列\n
100バイトの文字列\n
100バイトの文字列\n
:
:
:
と500行ある500KBののテキストファイルがあるとします
このファイルから
「499行目と500行目」
か
「1行目と2行目」
だけを取り出すとき、サーバーの負荷は
両方1〜500行の文字を取り出すときとほぼ同じ負荷でしょうか?
0648nobodyさん
2012/01/11(水) 20:50:49.28ID:???501 :nobodyさん:2012/01/08(日) 19:46:27.97 ID:???
>>489
abstractとinterfaceの具体的な使い分けはどうしてますか?
実装が書きたかったらabstractっていうのはあまりにもアレなので
哲学とまでは言いませんが、確固たる理由をつけて使い分けたいんです
0649nobodyさん
2012/01/11(水) 20:52:56.46ID:???読み込む位置が確定していたら、シークするだけの違いしかなく負荷に大差ないが。
改行位置の判定からやっていたら後ろの方が手間掛かる。
0650nobodyさん
2012/01/11(水) 21:08:42.58ID:???真実は一つだけ
怒りは自然な感情
戦争・テロは無くならない
死刑には殺人の抑止力がある
虐められる側にも虐めの原因がある
自己チューな人間ほど自己愛が強い
などの間違いを解説中
感情自己責任論
0651nobodyさん
2012/01/11(水) 21:13:42.02ID:tHZDD+V0という事はどんなやり方でも最低でも500KBかかってしまうという事でしょうか?
200バイト(2行分)程度だけで住む方法ないかなーと思ってたのですが
0652nobodyさん
2012/01/11(水) 21:34:41.86ID:???0653nobodyさん
2012/01/11(水) 22:26:31.01ID:???> 「499行目と500行目」
> 「1行目と2行目」
この二つの負荷には大差がないといっているんだろう。
本来の質問であるところの、
> 1〜500行の文字を取り出すとき
との負荷には大きな差があるよ。
固定長じゃない場合は、最後の2行を得るのが少し面倒だけど。
0654nobodyさん
2012/01/11(水) 22:33:40.13ID:???0655nobodyさん
2012/01/11(水) 22:33:46.01ID:???0656nobodyさん
2012/01/11(水) 22:45:01.77ID:???fileで全行読み込んでも良いよ。
そこがボトルネックになってから改良したら良い。
0657nobodyさん
2012/01/11(水) 22:47:30.54ID:???一応動くやつを作ってから速度測定して、
全体の中で時間掛かっているところに手を加えれば良い。
0658nobodyさん
2012/01/11(水) 23:02:44.07ID:tHZDD+V0「499行目と500行目」「1行目と2行目」この二つは差があるのでしょうか?という質問でした
説明不十分で申し訳ないです
やっぱりテキストファイルを固定長形式にするしか無いですかね?
この場合
100バイトの文字列
2Kバイトの文字列
4バイトの文字列
:
となった場合、全部2KBになって500行あったら1Mになってしまうので避けてたのですが
0659nobodyさん
2012/01/11(水) 23:06:53.90ID:???全て(1〜500行)のロードと2行のみでは負荷は違う。
可変長だったらindexをファイルの後方か先頭に配置して必要なところを読めば速いです。
0660nobodyさん
2012/01/11(水) 23:16:37.71ID:???そしたらメモリ管理など気にしなくて済むしキャッシュなども自動で使ってくれる
0661nobodyさん
2012/01/11(水) 23:39:54.74ID:GX2tXR1t0662nobodyさん
2012/01/11(水) 23:50:01.97ID:VbJoExbWすみません、今まで色々試しにやってて返事が遅くなりました
http://ja.wikipedia.org/wiki/Forkを参照に
#!/usr/local/bin/php -q
<?php
$pid = pcntl_fork();
if ($pid == 0) {
$j;
for ($j=0; $j < 10; $j++) {
printf("child: %d\n", $j);
sleep(1);
}
} else if($pid > 0) {
$i;
for ($i=0; $i < 10; $i++) {
printf("parent: %d\n", $i);
sleep(1);
}
print "wait begin.\n";
pcntl_wait($status);
print "wait end.\n";
} else {
die('fork できません');
}としました
0663nobodyさん
2012/01/11(水) 23:50:43.62ID:VbJoExbWchild: 0
child: 1
child: 2
child: 3
child: 4
child: 5
child: 6
child: 7
child: 8
child: 9
parent: 0
parent: 1
parent: 2
parent: 3
parent: 4
parent: 5
parent: 6
parent: 7
parent: 8
parent: 9
wait begin.
wait end.
のようになってparentがwikipediaのようにchildの間に入っておりません
"出力の順序はカーネルが決定する"とは書かれていますが、PHPではこのようなものなのでしょうか?
学習不足で申し訳ないです
0665nobodyさん
2012/01/12(木) 02:58:10.26ID:KRgm5yh10666nobodyさん
2012/01/12(木) 03:08:54.02ID:???0667nobodyさん
2012/01/12(木) 03:25:30.76ID:???そのコードでできたよ。
child: 0
parent: 0
child: 1
parent: 1
child: 2
parent: 2
(略)
child: 8
parent: 8
child: 9
parent: 9
wait begin.
wait end.
0669nobodyさん
2012/01/12(木) 03:43:15.46ID:???0670nobodyさん
2012/01/12(木) 03:52:56.74ID:???0671nobodyさん
2012/01/12(木) 04:51:39.62ID:???0676nobodyさん
2012/01/12(木) 13:02:25.38ID:???できる関数がありますが、これはPHPをCGIモードで
動かしている場合にのみ有効です。
通常はPHPをApacheモジュールとして動作させていることが
多いので、これが使えないケースが多々あります。
http://techblog.ecstudio.jp/tech-tips/php-multi.html
0677nobodyさん
2012/01/12(木) 13:15:01.92ID:???Perlで良いじゃん。
0678nobodyさん
2012/01/12(木) 13:19:01.14ID:???pcntl_fork関数は存在するし、forkも成功したように見えるけど、並列処理されないなんて結果になるということですか
0679nobodyさん
2012/01/12(木) 14:01:06.08ID:???俺は並列処理の事なんか分かっていないので、このやり方で合っているか分からないけれど
<?phpの後に、$time = time();
最終行に、echo 'time:' . (time() - $time) . 'sec' . PHP_EOL;を付けてみた
2chの改行規制で出力形式変えるけど結果は
child: 0 child: 1 child: 2
child: 3 child: 4 child: 5
child: 6 child: 7 child: 8
child: 9
time:10sec
parent: 0 parent: 1 parent: 2
parent: 3 parent: 4 parent: 5
parent: 6 parent: 7 parent: 8
parent: 9
wait begin.
wait end.
time:10sec
となった
>>676
http://www.php.net/manual/ja/pcntl.installation.php
にはCLI版も可能って書いてるんじゃないの?
>>675
ちなみに自分はcentOSです
0680nobodyさん
2012/01/12(木) 14:01:29.80ID:QAUYYhrI書き込むときの排他制御はどのようにやるのでしょうか?
0682nobodyさん
2012/01/12(木) 14:02:25.17ID:???0683679
2012/01/12(木) 14:02:52.80ID:???0684nobodyさん
2012/01/12(木) 14:10:41.80ID:???レンタルサーバーとかでは。
自宅で一人で使う目的だったらマルチスレッドをONにしてコンパイルすればいい。
しかしソースコードに汎用性が無くなる。
Curlをつかっとけ。5.3か5.2から標準で並列に使える。
0685nobodyさん
2012/01/12(木) 14:15:13.44ID:???0686nobodyさん
2012/01/12(木) 14:16:07.48ID:???プロセス制御機能を有効にするには、 configure のオプションに --enable-pcntl を付け、
CGI 版あるいは CLI 版の PHP をコンパイルする必要があります。
注意: 現在、このモジュールは非 Unix 環境(Windows)では動作しません。
http://www.php.net/manual/ja/pcntl.installation.php
0688679
2012/01/12(木) 14:27:53.78ID:???>>662を
if ($pid == 0) {
system('php forkc1.php');
system('php forkc2.php');
}
に変えて、それぞれに
<?php
$time = time();
$i;
for ($i=0; $i < 10; $i++) {
printf("child1: %d\n", $i);
sleep(1);
}
echo 'c1-time:' . (time() - $time) . 'sec' . PHP_EOL;
のように書いた
0689nobodyさん
2012/01/12(木) 14:28:15.56ID:???c1: 0 c1: 1 c1: 2 c1: 3 c1: 4 c1: 5 c1: 6 c1: 7 c1: 8 c1: 9
c1-time:10sec
c2: 0 c2: 1 c2: 2 c2: 3 c2: 4 c2: 5 c2: 6 c2: 7 c2: 8 c2: 9
c2-time:10sec
p-time:20sec
parent: 0 parent: 1 parent: 2 parent: 3 parent: 4 parent: 5 parent: 6 parent: 7 parent: 8 parent: 9
wait begin. wait end.
p-time:20sec
となった
で、実際の時計を見ていたら、20秒後に表示された
system('php forkc3.php');
も加えたら実際の時計では30秒後に表示された
これってどういうこと?
並列処理されていないってことだよね?
0690nobodyさん
2012/01/12(木) 14:30:51.41ID:???system('php forkc1.php');
system('php forkc2.php');
この時点で気付けよ
0691nobodyさん
2012/01/12(木) 14:36:08.80ID:???30秒かかるのは当たり前か・・・笑
>>679は10秒で済んでるから親プロセスと子プロセスはちゃんと並列処理されてるってことだね
自分の>>688の書き方が悪いだけか
この流れの話は、親プロセスから子プロセスを複数作成し、それを同時に実行
つまり3つの子プロセスがあれば4つとも10秒後に終わらせるということだよね?
となると実装法が思いつかないけど、pcntl_fork()っていうのを3回呼び出せばいいってことじゃないかな?
分からん
0694nobodyさん
2012/01/12(木) 14:56:29.29ID:???system('php forkc1.php &');
と、バックグラウンドプロセスにすればよろしい。
プロセスの終了待ち処理を入れる必要があるけど。
0695nobodyさん
2012/01/12(木) 15:05:23.27ID:???なるほど
実はまだ挑戦してて(笑
一度やり始めたら意地でもとなってしまってw
$pid[$i] = pcntl_fork();等と複数回呼び出して、
その後system()を呼び出すとかやってみたのですが30秒かかったりで
バックグラウンドプロセスという発想はなかったです
今から外に出ないといけないんですが、最後にちょっと試してみます
0696nobodyさん
2012/01/12(木) 15:10:13.69ID:???アハハ、今>>688のコードにて
if ($pid == 0) {
system('php forkc1.php &');
system('php forkc2.php &');
system('php forkc3.php &');
}
としましたが
今度は31秒かかってしまいましたw
どこがおかしいのか分かりませんが、また帰ってからやってみます
0697nobodyさん
2012/01/12(木) 15:17:35.81ID:???0698nobodyさん
2012/01/12(木) 15:23:17.54ID:???0699nobodyさん
2012/01/12(木) 15:29:16.52ID:???0701nobodyさん
2012/01/12(木) 15:31:28.10ID:???たぶん>>686のWindowsでは動かないというのをみたからじゃないのかな。
ほんとに動かないか知らないけど
0702nobodyさん
2012/01/12(木) 15:50:09.93ID:at33kcZ9CMSを使うか、フレームワーク使うかどっちがよろしいですかね・・・。
0703nobodyさん
2012/01/12(木) 16:55:38.26ID:???その文章だけを読んで「ちょっとしたポータルサイト」がどれほどの規模のものを指しているのか
わかる人は少ないだろう
0704nobodyさん
2012/01/12(木) 17:15:27.45ID:???0706nobodyさん
2012/01/12(木) 17:30:43.50ID:???どっちも詳しくない私は
使わない方がやりやすい。
0707nobodyさん
2012/01/12(木) 17:42:30.00ID:???0708nobodyさん
2012/01/12(木) 20:44:35.20ID:???0709nobodyさん
2012/01/12(木) 20:59:53.31ID:???0710nobodyさん
2012/01/12(木) 21:35:47.31ID:???0712nobodyさん
2012/01/12(木) 21:42:14.04ID:???0713nobodyさん
2012/01/12(木) 21:43:04.05ID:???0714nobodyさん
2012/01/12(木) 22:20:03.29ID:???0716nobodyさん
2012/01/12(木) 22:29:06.06ID:???なんで人の質問を俺がやってるのか分からんが、それが出来たら楽に処理できるような事も
出てくるかなと思ってやってみたんだけど
>>698
いや、だって引数とって一気に別ファイルのスクリプト実行するんでしょ?
system()じゃないの?
>>700
ごめんどういうこと?
$php fork-test.php > /dev/null
とかってこと?
同時に実行されていくということは
c1:0
c2:0
c1:1
c2:1
のように出てくるのかなとか思ってたんだけど違うん?
0719nobodyさん
2012/01/12(木) 22:48:45.79ID:???ごめん、分かりませんw
forkって子プロセスを作成->親プロセスは待機->子プロセス終了->親プロセス実行
って動作だよね?
で、子プロセスは親プロセスのコピーであると
だから元々親プロセスの時点で実行されていたり、格納していた変数の値とかは子プロセスも保持していると
ま、自分の分からない所は子プロセスを複数作成するにはPHPだとpcntl_fork()をその回数実行すると
ただ、自分がやったのでは
$pid1=pcntl_fork();
$pid2=pcntl_fork();
それぞれにて上記のようなfor()を使うと一緒に実行されるんじゃなくて、直列(逐次)処理になってて「う〜ん」と
別ファイルのスクリプトを実行するのにPCNTL関数内にそんな感じの関数もないし、
データベースなどから設定値を取得してきて、そこから得てきたそれぞれの設定値を渡すとなると
system()かなと考えて・・・
例えばどんな風に書けばいいんですかね?
0721nobodyさん
2012/01/12(木) 22:54:57.73ID:???ちなみに>>662におけるsleepをタイムスライス放棄のみのコードに変更した場合の出力結果例はこんな感じ。
child1: 0
parent: 0
parent: 1
child1: 1
parent: 2
parent: 3
child1: 2
parent: 4
parent: 5
child1: 3
parent: 6
child1: 4
parent: 7
child1: 5
parent: 8
child1: 6
parent: 9
wait begin.
child1: 7
child1: 8
child1: 9
wait end.
あとID出せよカス
0722nobodyさん
2012/01/12(木) 23:11:37.74ID:QxDXzJq0sleep(-1)ってのが出てきましたがこれの事ですかね?
俺は>>667のようにはならないんですが、OSは何ですか?
つまり、>>662のようなfor()文使った場合は、子プロセス->親プロセス->子プロセス->親プロセス->
という挙動をすると言うことですか?
しかし俺全然だめだなぁ・・・
■ このスレッドは過去ログ倉庫に格納されています