はじめに: Android 4.0 開発では、HTTP リクエストの送信はメイン プロセスで実行できなくなり、スレッドで実行する必要があります。その理由は、HTTP インターフェイスの応答時間がメイン プロセスのイベント監視をブロックする可能性があるためです (.Net 開発についても同様です)。ただし、PHP にはマルチスレッドの概念がないため、PHP で複数の http リクエストを効率的に実行するにはどうすればよいでしょうか?答えはcurl_multi_initを使うことなので実験してみました。
以下はリクエストをシミュレートする http インターフェースです。コードは非常に単純です。スリープ時間は get によって渡されるパラメーター time によって制御されます。
$s_time=intval($_GET['time']); sleep($s_time); echo 'hello';
$start=microtime(true); for($i=1;$i<=5;++$i) { $ch=curl_init("http://test.binbin.com/curl/test.php?time={$i}"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_exec($ch); } $end=microtime(true); echo $end-$start;
$start=microtime(true); $ch_list=array(); $multi_ch=curl_multi_init(); for($i=1;$i<=5;++$i) { $ch_list[$i]=curl_init("http://test.binbin.com/curl/test.php?time={$i}"); curl_setopt($ch_list[$i], CURLOPT_RETURNTRANSFER, true); curl_multi_add_handle($multi_ch, $ch_list[$i]); } $running=false; do { usleep(10000); curl_multi_exec($multi_ch, $running); }while ($running>0); $end=microtime(true); echo $end-$start;
追記:curl_multi_init を使用した過剰な CPU 使用率の問題をブログで報告している人がたくさんいました。実際には、usleep を追加することで解決できます。データが返されない場合、curl_multi_exec は実行を継続し、CPU リソースを消費するためです。
上記は、http リクエストをバッチで送信するための phpcurl を、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。