PHPで複数ブログのRSSを同時に読み込む

2013.11.05 火曜日 23:47:02

PHPでAPIを使うときにリクエストの数が多いとどうしても重くなってしまう時があるかと思います。

そこで重宝するのが「curl_multi」関数です。
「curl_multi」は複数リクエストを並列に走らせることができるので、
複数ブログのRSSを同時に読み込む時などに非常に活躍します。

<?php

//表示記事数
$hyojiNum = 30;
 
//フィード登録
$data['feedurl'][] = 'http://feeds.feedburner.com/design-develop/BZkU';
$data['feedurl'][] = 'http://feeds.feedburner.com/designwork-s/YGrB';
//$data['feedurl'][] = ''; 必要な分だけ追加してください
 
$rssList = $data['feedurl'];
 
    //同時呼び出し
    $rssdataRaw = multiRequest($rssList);
    for($n=0;$n<count($rssdataRaw);$n++){
        //URL設定
        $rssdata = simplexml_load_string($rssdataRaw[$n], 'SimpleXMLElement', LIBXML_NOCDATA);
        if($rssdata->channel->item) $rssdata = $rssdata->channel;
        if($rssdata->item){
 $b_title=$rssdata->title;
            foreach($rssdata->item as $myEntry){
  
                $rssDate = $myEntry->pubDate;
                if(!$rssDate) $rssDate = $myEntry->children("http://purl.org/dc/elements/1.1/")->date;
                date_default_timezone_set('Asia/Tokyo');
                $myDateGNU = strtotime($rssDate);
                $myDate = date('Y/m/d',$myDateGNU);
                $myTitle = mb_strimwidth($myEntry->title, 0,60, "…", utf8); //タイトル取得

                $myLink = $myEntry->link; //リンクURL取得
               
$myContent = $myEntry->children('http://purl.org/rss/1.0/modules/content/');
$myContent2 = $myContent->encoded;
preg_match('/<img .*?src ?= ?[\'"]([^>]+)[\'"].*?>/i', $myContent2, $img_all);
preg_match('/http.*?(\.gif|\.png|\.jpg|\.jpeg$|\.bmp)/i', $img_all[0], $gazo);

$outdata[$myDateGNU] ='<a href="' . $myLink . '" target="_blank" class="clearfix blogs">
<div class="blogs_left"><img src="'.$gazo[0].'" width="70"></div>
<div class="blogs_right">
<div class="blog_t">'.$myTitle.'</div>
<div class="blog_name">'.$myDate.'</div>
<div class="blog_date">'.$b_title.'</div>
</div>
</a>';
    
            }
        }
    }
 
    //ソート
    krsort($outdata);
    
$nn = 0;
$html = '';
 
//
foreach($outdata as $outdata) {
    $nn++;
    $html.= $outdata;
     if($nn == $hyojiNum) break;
}

// ここで「echo $html」 で一覧表示できます。
 
//ここから同時呼び出し関数
function multiRequest($data, $options = array()) {
  
  // 配列を用意します。
  $curly = array();
  // data to be returned
  $result = array();
  
  //並列ファンクション
  $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);
  
    // 投稿記事があるかどうか
    if (is_array($d)) {
      if (!empty($d['post'])) {
        curl_setopt($curly[$id], CURLOPT_POST, 1);
        curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']);
      }
    }
  
    if (!empty($options)) { curl_setopt_array($curly[$id], $options);}
    curl_multi_add_handle($mh, $curly[$id]);
  }
  
  $running = null;
// ハンドルを実行
  do {
    curl_multi_exec($mh, $running);
  } while($running > 0);
  
  foreach($curly as $id => $c) {
    $result[$id] = curl_multi_getcontent($c);
    curl_multi_remove_handle($mh, $c);
  }
  
  // ハンドルを閉じる
  curl_multi_close($mh);
  
  return $result;
}

?>

ちなみに「curl_multi」はphp5から使えるので注意してください。

今、iphoneアプリでRSSリーダーを制作しているのですが、
コアとなる複数ブログの部分が、複雑になってしまい困ってましたがこの関数ですべて解決!

困っている方は是非試してみてください。

Category:DIARY     Tag:api curl curl_multi iphone php rss アプリ 複数
Our Business
最近の記事
人気記事
Our Project
comming soon