複数リクエストの場合は
勿論、並列にリクエストを実行するcurl_multiの方が早いでしょう。curl_multiを使っての実装方法はAPIとの通信効率をよくする実装例(1) curl_multi (Yahoo!JapanのTechBlog)に詳しく載っています。
じゃあ、リクエストが1つだけの場合は?
勿論、無駄な処理のないただのcURLの方が早いでしょう。それは分かるけどどれくらいの差があるのでしょうか?
実験してみます。
PHPは5.2.5です。
ただのcURL場合
以下のプログラム(抜粋ですが)を10回試行して平均を取ってみます。$url = "http://www.yahoo.co.jp/";
$start = microtime();
$res = my_curl($url);
if($res["info"]["http_code"] == 200){
print("success");
}else{
print("error");
}
$end = microtime();
function my_curl($url){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec($ch);
$info = curl_getinfo($ch);
return array("res" => $res, "info" => $info);
}
平均すると0.1679922秒かかりました。
curl_multiの場合
同じく、以下のプログラム(抜粋ですが)を10回試行して平均を取ってみます。$url = "http://www.yahoo.co.jp/";
$start = microtime();
$res = my_curl_multi(array($url));
if($res[0]["info"]["http_code"] == 200){
print("success");
}else{
print("error");
}
$end = microtime();
function my_curl_multi($urls){
$mh = curl_multi_init();
$chs = array();
foreach($urls as $url){
$ch = curl_init($url);
$chs[] = $ch;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_multi_add_handle($mh, $ch);
}
do{
curl_multi_exec($mh, $running);
}while($running);
$res = array();
foreach($chs as $ch){
$info = curl_getinfo($ch);
$body = curl_multi_getcontent($ch);
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
$res[] = array("res" => $body, "info" => $info);
}
curl_multi_close($mh);
return $res;
}
平均すると0.300859秒かかりました。
まとめ
秒数自体は通信環境に因るところが大きいと思うので参考程度に…ですが、それにしてもコンマ数秒のオーダーで違ってきています。並列処理をする必要がない場合は、極力通常のcURLを使用するのがよさそうです。
0 件のコメント:
コメントを投稿