2010年11月15日月曜日

PHPで、1つのリクエストに対するcurlとcurl_multiとのパフォーマンスの差

複数リクエストの場合は
勿論、並列にリクエストを実行する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 件のコメント:

コメントを投稿


Related Posts Plugin for WordPress, Blogger...