HOME > スポンサー広告 > title - [PHP]マッシュアップでの高速処理HOME > PHP > title - [PHP]マッシュアップでの高速処理


スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | TB(-) | CM(-)

[PHP]マッシュアップでの高速処理

複数のRSSを高速に処理する

スポンサードリンク

Yahoo!ブックマークに登録 newsing it! この記事をクリップ! BuzzurlにブックマークBuzzurlにブックマーク このエントリーをはてなブックマークに追加

マッシュアップで複数のAPIを同時に叩く

通常、PHPでAPIにアクセスする場合



①のRSSにアクセスして応答があってから②に進む。
処理の応答に時間がかかるのでアクセス数が増えると時間も多くかかる。


マッシュップでアクセスする場合



同時に複数のAPIにアクセスするので待ち時間がない。
アクセス先の数が2個ではなく、もっと多くなった際、その差はより顕著ですね。

multiRequest関数

multiRequest関数で複数のAPIを叩く

multiRequest関数で複数APIを並列処理して高速化を実現する。
$rに取得したXML文字列が順番に格納されています。

動作サンプル・コード

サンプル

  1. <?php
  2. $data = array(
  3. 'http://niconico.boy.jp/soccer/rss.xml',
  4. 'http://yakinews.seesaa.net/index20.rdf',
  5. 'http://computernlife.blog.fc2.com/?xml',
  6. );
  7. $r = multiRequest($data);
  8. print '<xmp>';
  9. print_r($r);
  10. print '</xmp>';
  11. function multiRequest($data, $options = array()) {
  12. // array of curl handles
  13. $curly = array();
  14. // data to be returned
  15. $result = array();
  16. // multi handle
  17. $mh = curl_multi_init();
  18. // loop through $data and create curl handles
  19. // then add them to the multi-handle
  20. foreach ($data as $id => $d) {
  21. $curly[$id] = curl_init();
  22. $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d;
  23. curl_setopt($curly[$id], CURLOPT_URL, $url);
  24. curl_setopt($curly[$id], CURLOPT_HEADER, 0);
  25. curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1);
  26. // post?
  27. if (is_array($d)) {
  28. if (!empty($d['post'])) {
  29. curl_setopt($curly[$id], CURLOPT_POST, 1);
  30. curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']);
  31. }
  32. }
  33. // extra options?
  34. if (!empty($options)) {
  35. curl_setopt_array($curly[$id], $options);
  36. }
  37. curl_multi_add_handle($mh, $curly[$id]);
  38. }
  39. // execute the handles
  40. $running = null;
  41. do {
  42. curl_multi_exec($mh, $running);
  43. } while($running > 0);
  44. // get content and remove handles
  45. foreach($curly as $id => $c) {
  46. $result[$id] = curl_multi_getcontent($c);
  47. curl_multi_remove_handle($mh, $c);
  48. }
  49. // all done
  50. curl_multi_close($mh);
  51. return $result;
  52. }
  53. function getmicrotime() {
  54. list($usec, $sec) = explode(" ", microtime());
  55. return ((float)$sec + (float)$usec);
  56. }
  57. ?>

simplexml_load_string()関数でオブジェクトにXML文字列を代入

$rに代入されたXML文字列を simplexml_load_string関数でオブジェクトに代入します。

動作サンプル・コード

サンプル

  1. foreach ($r as $list) {
  2. $xml = simplexml_load_string($list);
  3. print '<xmp>';
  4. print_r($xml);
  5. print '</xmp>';
  6. }
  1. <?php
  2. $data = array(
  3. 'http://niconico.boy.jp/antena/rss.xml',
  4. 'http://yakinews.seesaa.net/index.rdf',
  5. 'http://www.nicovideo.jp/tag/%E6%96%99%E7%90%86?sort=f&rss=2.0&lang=ja-jp',
  6. );
  7. $ball = array();
  8. $r = multiRequest($data);
  9. foreach ($r as $list) {
  10. $xml = simplexml_load_string($list);
  11. print '<xmp>';
  12. print_r($xml);
  13. print '</xmp>';
  14. }
  15. function multiRequest($data, $options = array()) {
  16. // array of curl handles
  17. $curly = array();
  18. // data to be returned
  19. $result = array();
  20. // multi handle
  21. $mh = curl_multi_init();
  22. // loop through $data and create curl handles
  23. // then add them to the multi-handle
  24. foreach ($data as $id => $d) {
  25. $curly[$id] = curl_init();
  26. $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d;
  27. curl_setopt($curly[$id], CURLOPT_URL, $url);
  28. curl_setopt($curly[$id], CURLOPT_HEADER, 0);
  29. curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1);
  30. // post?
  31. if (is_array($d)) {
  32. if (!empty($d['post'])) {
  33. curl_setopt($curly[$id], CURLOPT_POST, 1);
  34. curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']);
  35. }
  36. }
  37. // extra options?
  38. if (!empty($options)) {
  39. curl_setopt_array($curly[$id], $options);
  40. }
  41. curl_multi_add_handle($mh, $curly[$id]);
  42. }
  43. // execute the handles
  44. $running = null;
  45. do {
  46. curl_multi_exec($mh, $running);
  47. } while($running > 0);
  48. // get content and remove handles
  49. foreach($curly as $id => $c) {
  50. $result[$id] = curl_multi_getcontent($c);
  51. curl_multi_remove_handle($mh, $c);
  52. }
  53. // all done
  54. curl_multi_close($mh);
  55. return $result;
  56. }
  57. ?>

一連の流れ

multiRequest関数でAPIを叩く

  1. $data = array(
  2. 'http://niconico.boy.jp/antena/rss.xml',
  3. 'http://yakinews.seesaa.net/index.rdf',
  4. 'http://www.nicovideo.jp/tag/%E6%96%99%E7%90%86?sort=f&rss=2.0&lang=ja-jp',
  5. );
  6. $r = multiRequest($data);

$rに代入されたXML文字列を simplexml_load_string関数でオブジェクトに代入します。

  1. $array = array();
  2. $r = multiRequest($data);
  3. foreach ($r as $list) {
  4. $xml = simplexml_load_string($list);
  5. }

オブジェクトに代入した要素を$arrayに代入

RSSのバージョンにXMLの書式が違います。
よって値にアクセスするには一工夫必要です。

  1. $array = array();
  2. $r = multiRequest($data);
  3. foreach ($r as $list) {
  4. $xml = simplexml_load_string($list);
  5. $blog_title = ($xml->channel->title);
  6. $blog_link = ($xml->channel->link);
  7. if(isset($xml->item)){
  8. foreach ($xml->item as $item) {
  9. if(isset($item->children('http://purl.org/dc/elements/1.1/')->date)){
  10. $timess = $item->children('http://purl.org/dc/elements/1.1/')->date;
  11. }else{
  12. $timess = $item->pubDate;
  13. }
  14. array_push($array,
  15. array(
  16. "unix" => date('U',strtotime($timess)),
  17. "time" => date('c',strtotime($timess)),
  18. "title" => $item->title,
  19. "link" => $item->link,
  20. "blog_title" => $blog_title,
  21. "blog_link" => $blog_link,
  22. )
  23. );
  24. }
  25. }
  26. if(isset($xml->channel->item)){
  27. foreach ($xml->channel->item as $item) {
  28. if(isset($item->children('http://purl.org/dc/elements/1.1/')->date)){
  29. $timess = $item->children('http://purl.org/dc/elements/1.1/')->date;
  30. }else{
  31. $timess = $item->pubDate;
  32. }
  33. array_push($array,
  34. array(
  35. "unix" => date('U',strtotime($timess)),
  36. "time" => date('c',strtotime($timess)),
  37. "title" => $item->title,
  38. "link" => $item->link,
  39. "blog_title" => $blog_title,
  40. "blog_link" => $blog_link,
  41. )
  42. );
  43. }
  44. }
  45. }

$arrayを時間でソート

  1. foreach($array as $key=>$row){
  2. $size[$key] = $row['unix'];
  3. }
  4. array_multisort($array,SORT_DESC,$size);

配列$arrayの値


$array[0] => Array
(
[unix] => 1355626809 //Unix Epoch
[time] => 2012-12-16T12:00:09+09:00 //ISO 8601 日付
[title] => SimpleXMLElement Object
(
[0] => 3年総額6億円じゃ足りん!? //記事タイトル
)

[link] => SimpleXMLElement Object
(
[0] => http://niconico.boy.jp/antena/1355626809.html //記事URL
)

[blog_title] => SimpleXMLElement Object
(
[0] => やきうアンテナ //ブログタイトル
)

[blog_link] => SimpleXMLElement Object
(
[0] => http://niconico.boy.jp/antena/ //ブログURL
)

)

動作サンプル・コード

サンプル

  1. <?php
  2. $data = array(
  3. 'http://niconico.boy.jp/antena/rss.xml',
  4. 'http://yakinews.seesaa.net/index.rdf',
  5. 'http://www.nicovideo.jp/tag/%E6%96%99%E7%90%86?sort=f&rss=2.0&lang=ja-jp',
  6. );
  7. $array = array();
  8. $r = multiRequest($data);
  9. foreach ($r as $list) {
  10. $xml = simplexml_load_string($list);
  11. $blog_title = ($xml->channel->title);
  12. $blog_link = ($xml->channel->link);
  13. if(isset($xml->item)){
  14. foreach ($xml->item as $item) {
  15. if(isset($item->children('http://purl.org/dc/elements/1.1/')->date)){
  16. $timess = $item->children('http://purl.org/dc/elements/1.1/')->date;
  17. }else{
  18. $timess = $item->pubDate;
  19. }
  20. array_push($array,
  21. array(
  22. "unix" => date('U',strtotime($timess)),
  23. "time" => date('c',strtotime($timess)),
  24. "title" => $item->title,
  25. "link" => $item->link,
  26. "blog_title" => $blog_title,
  27. "blog_link" => $blog_link,
  28. )
  29. );
  30. }
  31. }
  32. if(isset($xml->channel->item)){
  33. foreach ($xml->channel->item as $item) {
  34. if(isset($item->children('http://purl.org/dc/elements/1.1/')->date)){
  35. $timess = $item->children('http://purl.org/dc/elements/1.1/')->date;
  36. }else{
  37. $timess = $item->pubDate;
  38. }
  39. array_push($array,
  40. array(
  41. "unix" => date('U',strtotime($timess)),
  42. "time" => date('c',strtotime($timess)),
  43. "title" => $item->title,
  44. "link" => $item->link,
  45. "blog_title" => $blog_title,
  46. "blog_link" => $blog_link,
  47. )
  48. );
  49. }
  50. }
  51. }
  52. foreach($array as $key=>$row){
  53. $size[$key] = $row['unix'];
  54. }
  55. array_multisort($array,SORT_DESC,$size);
  56. print '<xmp>';
  57. print_r($array);
  58. print '</xmp>';
  59. function multiRequest($data, $options = array()) {
  60. // array of curl handles
  61. $curly = array();
  62. // data to be returned
  63. $result = array();
  64. // multi handle
  65. $mh = curl_multi_init();
  66. // loop through $data and create curl handles
  67. // then add them to the multi-handle
  68. foreach ($data as $id => $d) {
  69. $curly[$id] = curl_init();
  70. $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d;
  71. curl_setopt($curly[$id], CURLOPT_URL, $url);
  72. curl_setopt($curly[$id], CURLOPT_HEADER, 0);
  73. curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1);
  74. // post?
  75. if (is_array($d)) {
  76. if (!empty($d['post'])) {
  77. curl_setopt($curly[$id], CURLOPT_POST, 1);
  78. curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']);
  79. }
  80. }
  81. // extra options?
  82. if (!empty($options)) {
  83. curl_setopt_array($curly[$id], $options);
  84. }
  85. curl_multi_add_handle($mh, $curly[$id]);
  86. }
  87. // execute the handles
  88. $running = null;
  89. do {
  90. curl_multi_exec($mh, $running);
  91. } while($running > 0);
  92. // get content and remove handles
  93. foreach($curly as $id => $c) {
  94. $result[$id] = curl_multi_getcontent($c);
  95. curl_multi_remove_handle($mh, $c);
  96. }
  97. // all done
  98. curl_multi_close($mh);
  99. return $result;
  100. }
  101. ?>

スポンサードリンク

loading...
自分だけのアバターで友達をつくろう!【MILU(ミル)】
人気ブログランキングへ
Yahoo!ブックマークに登録 newsing it! この記事をクリップ! BuzzurlにブックマークBuzzurlにブックマーク このエントリーをはてなブックマークに追加
[ 2012/12/16 16:10 ] PHP | TB(4) | CM(0)

コメントの投稿













管理者にだけ表示を許可する

トラックバック:

この記事のトラックバック URL
http://computernlife.blog.fc2.com/tb.php/64-8117dacb


-

管理人の承認後に表示されます
[2016/08/08 07:59] URL

-

管理人の承認後に表示されます
[2016/09/22 18:54] URL

-

管理人の承認後に表示されます
[2017/04/03 13:39] URL

-

管理人の承認後に表示されます
[2017/09/19 12:06] URL



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。