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回アクセスするスクリプトを動かすとかいうのは無しでお願いします)
http://d.hatena.ne.jp/yutakikuchi/20120521/1337557316
ブログ中では、「マルチスレッド」という表現がされていますが、マルチプロセスです。
fork って、Unix 系 OS のシステムコールなんで、Windows じゃ使えません。
http://www.php.net/manual/ja/intro.pcntl.php
注意: この拡張モジュールは Windows 環境では利用できません。
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() で、バックグラウンド実行になるような指定をして呼び出す、という感じでしょうか。
負荷テスト用のツールを使うのがお手軽だと思います。
たとえば、 JMeter とか。
http://jmeter.apache.org/
ツール自体はJAVAでできてますが、
ブラウザの動作をシミュレートして負荷をかけれます。
>10人の人間が10回のF5を行い100回の負荷としたいと思っています。
このツールで可能です。
もちろん1台のクライアントから可能です。
回答ありがとうございます。
質問にもPHPでの質問と記載しておりましたが、こちらの検索で出てくるツールはだいたい使用しております。
ご紹介いただいたツールについても以前に非常にお世話になっておりました。
今回はいろいろあってWEB上で行いたかったので私が扱えるPHP言語でということで質問させていただいておりました。
http://d.hatena.ne.jp/memory_agape/20110410/1302446793
http://denullpo.exblog.jp/12000131/
popen とかproc_open
とかでも、結構簡単にできると思います。
回答ありがとうございます。
2012/08/18 23:49:44こういったものがあるのを知りませんでした。
まだ試してはおらずcurl_multi_execについて色々と確認している最中ですがこちらでいけそうです。
他にもいろいろと応用が出来そうですのでこちらを使ってみたいと思います。
ありがとうございました。