PHPでの質問です。


WEB上から負荷テストをしたいと思い単純ではありますが
以下のようなテストスクリプトを作成しました。

for( $i = 0; $i < 100; $i++ )
{
$file = file_get_contents('http://www.google.co.jp/');
file_put_contents($i, $file);
}
(アドレスはあくまでサンプルです)

この場合は言い換えれば一人の人間がwww.google.co.jpに対してF5を100回押しているのと同じです。
一人の人間が100回のF5を押すのではなく、apacheのabでいうスレッド(と言っていいのかちょっとわからないですが)のように
10人の人間が10回のF5を行い100回の負荷としたいと思っています。
file_get_contentsでそういったスレッド的な事が出来るかどうかがわからないのですが
同じようなことが出来る書き方や手法があれば教えていただけないでしょうか。
(10個のPCから10回アクセスするスクリプトを動かすとかいうのは無しでお願いします)

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/08/24 09:47:36
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント50pt

PCNTL の pcntl_fork を使う方法

http://d.hatena.ne.jp/yutakikuchi/20120521/1337557316
ブログ中では、「マルチスレッド」という表現がされていますが、マルチプロセスです。

fork って、Unix 系 OS のシステムコールなんで、Windows じゃ使えません。
http://www.php.net/manual/ja/intro.pcntl.php

注意: この拡張モジュールは Windows 環境では利用できません。


cURL の curl_multi_exec を使う方法

http://techblog.yahoo.co.jp/architecture/api1_curl_multi/
先のページからたどれるページです。
特に、どの動作環境で、というような記載はマニュアルにはありません。

ページに記載されているサンプルは、割とシンプルですが、オプションがいろいろありそう。

http://techblog.ecstudio.jp/tech-tips/php-multi.html
このページに書かれているソースだと、待ち合わせの仕方が違うんですよね。
curl_multi_exec のループが二回ある...
あー、二番目の方はマニュアルのサンプルがべースなんですね。
とりあえず、第二引数が 1 の間は呼び続ける、ということで良いのかな。



OS が Windows 系なら cURL を使うしかありませんが、URL で指定した内容を読み取るだけしかできないので、例えば、それぞれの応答時間を記録しておきたい、だとか、file_get_contents 以外のことを付け加えたくなると、pcntl_fork を使うことになると思います。

ブログ中にも記載がありますが、fork はプロセスを生成するので、それなりのコストがかかります。コストと言っても、多少ですけど、百回ループで呼び出したときに、全部同時にヨーイドン、というわけにはいきません。
また、プロセス数の制限もありますから、並列に動かしたい処理の数によっては、制限を緩める必要があります。



後は、お手軽なところで、一回だけ file_get_contents を呼び出すスクリプトを書いておいて、別のスクリプトから system() で、バックグラウンド実行になるような指定をして呼び出す、という感じでしょうか。

id:quocard

回答ありがとうございます。

こういったものがあるのを知りませんでした。
まだ試してはおらずcurl_multi_execについて色々と確認している最中ですがこちらでいけそうです。
他にもいろいろと応用が出来そうですのでこちらを使ってみたいと思います。
ありがとうございました。

2012/08/18 23:49:44
id:taroe No.2

回答回数1099ベストアンサー獲得回数132

ポイント50pt

負荷テスト用のツールを使うのがお手軽だと思います。

たとえば、 JMeter とか。
http://jmeter.apache.org/

ツール自体はJAVAでできてますが、
ブラウザの動作をシミュレートして負荷をかけれます。

>10人の人間が10回のF5を行い100回の負荷としたいと思っています。
このツールで可能です。

もちろん1台のクライアントから可能です。

id:quocard

回答ありがとうございます。

質問にもPHPでの質問と記載しておりましたが、こちらの検索で出てくるツールはだいたい使用しております。
ご紹介いただいたツールについても以前に非常にお世話になっておりました。
今回はいろいろあってWEB上で行いたかったので私が扱えるPHP言語でということで質問させていただいておりました。

2012/08/18 23:51:34
id:taroe

http://d.hatena.ne.jp/memory_agape/20110410/1302446793
http://denullpo.exblog.jp/12000131/

popen とかproc_open‍
とかでも、結構簡単にできると思います。

2012/08/19 00:05:32

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません