マッシュアップサイトで必須

phpで複数APIを叩く際に、数が多ければ多いほど遅くなります。
そんな時に使うのはmultiRequest関数です。
データの読み込みを並列処理にして一度にデータを取得してしまおうというアイデアです。

<?php 

function multiRequest($data, $options = array()) { 

  // array of curl handles 
  $curly = array(); 
  // data to be returned 
  $result = array(); 

  // multi handle 
  $mh = curl_multi_init(); 

  // loop through $data and create curl handles 
  // then add them to the multi-handle 
  foreach ($data as $id => $d) { 

    $curly[$id] = curl_init(); 

    $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d; 
    curl_setopt($curly[$id], CURLOPT_URL,            $url); 
    curl_setopt($curly[$id], CURLOPT_HEADER,         0); 
    curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1); 

    // post? 
    if (is_array($d)) { 
      if (!empty($d['post'])) { 
        curl_setopt($curly[$id], CURLOPT_POST,       1); 
        curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']); 
      } 
    } 

    // extra options? 
    if (!empty($options)) { 
      curl_setopt_array($curly[$id], $options); 
    } 

    curl_multi_add_handle($mh, $curly[$id]); 
  } 

  // execute the handles 
  $running = null; 
  do { 
    curl_multi_exec($mh, $running); 
  } while($running > 0); 

  // get content and remove handles 
  foreach($curly as $id => $c) { 
    $result[$id] = curl_multi_getcontent($c); 
    curl_multi_remove_handle($mh, $c); 
  } 

  // all done 
  curl_multi_close($mh); 

  return $result; 
} 

?>

次のようにURLの配列を渡してデータを一括取得できます。

<?php 

$data = array( 
  'http://search.yahooapis.com/VideoSearchService/V1/videoSearch?appid=YahooDemo&query=Pearl+Jam&output=json', 
  'http://search.yahooapis.com/ImageSearchService/V1/imageSearch?appid=YahooDemo&query=Pearl+Jam&output=json', 
  'http://search.yahooapis.com/AudioSearchService/V1/artistSearch?appid=YahooDemo&artist=Pearl+Jam&output=json' 
); 
$r = multiRequest($data); 

echo 'pre'; 
print_r($r);