はじめに
私はここ数年間、PHPとMySQLおよびRubyを使用してRSSアグリゲータを自作する方法を紹介してきました。前にチュートリアルを書いてから5年を経ても、RSSは相変わらず強力であり、多様化する一方のオンライン情報を追跡するための手段として世界中の何百万ものユーザーに頼りにされています。たとえば、私が2004年に書いたチュートリアルでは、RSSの普及に貢献しているWebサイトとして、Yahoo!、CNET、The Christian Science Monitorなどの名前を挙げていました。5年後の今、RSSはごくありふれた情報伝達手法となり、その応用範囲は電子メールを読んだり、お天気情報を見たり、Twitterで仲間の活動を知ったりすることにまで広がっています。RSSフィードの機能をまだ自分のWebサイトに組み込んでいないのならば、導入を検討してみてはいかがでしょうか。RSSフィードを提供しないということは、あなたのWebサイトの更新情報を随時入手する優れたメカニズムを現在のユーザーに使わせないだけでなく、数多くのWebサイトを何度も訪れる手間を省きたいと思っている人を拒むことにもなり、今後のユーザー数拡大の妨げになります。
それでもまだちょっと・・・という人もいるかもしれませんね。では、現在使っているカスタムデータからごく簡単な方法でRSSフィードを作成できると言ったら、さらに、そのRSSフィードに広告を直接統合すれば収入にもなると言ったらどうでしょうか。Zend FrameworkとGoogle AdSenseを使えば、両方の目的を驚くほど簡単に達成できます。このチュートリアルでは、その方法を紹介します。
Zend Frameworkでのカスタムフィードの作成
以前のチュートリアルを見てもらうとわかるように(Twitter、多言語化、Amazon Webサービス、OpenID認証の各チュートリアルを参照)、Zend Frameworkは非常に強力なソリューションであり、Web開発者はこれを使用することで保守の簡単なWebサイトを作成できるだけでなく、最新のWebサービスも利用することができます。Zend Frameworkに含まれるZend_Feedコンポーネントを使用すると、RSSフィードの作成と利用がとても簡単になります。
たとえば、定期的に実行するcron
ジョブと組み合わせてZend_Feedを使用すれば、Amazon.comの売上に基づいて最も人気のある25のテレビゲームを通知するRSSフィードを作成できます。wgetとHTTP認証を使用して、6時間ごとにcron
ジョブを実行し、curlを使用して最新のRSSフィードの作成を開始するURLにアクセスします。crontab
のエントリは次のようになります。
0 0,6,12,18 * * * /usr/bin/curl --user webuser:supersecret --silent http://www.gamenomad.com/cronjobs/populargames
このエントリではcronに対して、毎日、午前0時、午前6時、午後0時、午後6時に実行し、curlプログラムを使用して指定のGameNomad URLにアクセスするように指示します。このURLは誰でもアクセス可能にしたくないので、パスワードで保護してあります。認証はcurlの--user
オプションを使用して行います。cron
とcrontab
の詳細については、Wikipediaの「cron」の項目を参照してください。
cron
ジョブコントローラーの中にあるpopulargames
アクションを次に示します。このアクションは、Zend_Feedコンポーネントを利用し、WebサイトのMySQLデータベースに格納されている情報に基づいてフィードを作成します。本稿では、アクションの内容を1行ずつ細かく説明することはしません。重要な処理をしている行についてのみ、後で行番号を示しながら説明します。
01 public function populargamesAction() 02 { 03 04 // Create array to store the RSS feed entries 05 $entries = array(); 06 07 // Retrieve the 25 most popular games 08 $game = new Game(); 09 $rankings = $game->getLatestSalesRanks(25); 10 11 // Cycle through the rankings, creating an array storing 12 // each, and push the array onto the $entries array 13 foreach ($rankings AS $ranking) { 14 $entry = array( 15 'title' => "{$ranking->title} ({$ranking->platform})", 16 'link' => "http://www.gamenomad.com/games/ {$ranking->asin}", 17 'description' => "Sales Rank: #{$ranking->rank}", 18 ); 19 array_push($entries, $entry); 20 } 21 22 // Create the RSS array 23 $rss = array( 24 'title' => 'GameNomad: Popular Games', 25 'link' => 'http://www.gamenomad.com/games/ranks', 26 'charset' => 'ISO-8859-1', 27 'entries' => $entries 28 ); 29 30 // Import the array 31 $feed = Zend_Feed::importArray($rss, 'rss'); 32 33 // Write the feed to a variable 34 $rssFeed = $feed->saveXML(); 35 36 // Write the feed to a file residing in /public/rss 37 $fh = fopen($this->config->feed->popular_games, "w"); 38 fwrite($fh, $rssFeed); 39 fclose($fh); 40 41 }
Zend Frameworkをある程度使ったことがある人ならば、ここで示したコードの大部分は既にお馴染みでしょう。見慣れないのはZend_Feed固有の呼び出しの部分だけだと思います。それでは、このリストの重要な行について解説します。
- 9行目 ― Gameモデルで定義されているメソッドを使って、販売ランキング上位25商品から成る配列を取得します。
- 13~20行目 ― 配列をループ処理して、各ゲームのタイトル、プラットフォーム、GameNomadのURL、最新の販売ランクから成る連想配列を作成します。19行目では、この連想配列
$entry
を別の配列$entries
にプッシュします。この配列$entries
に、新たに作成した個々の連想配列が格納されることになります。 - 24~26行目 ― RSSフィードのタイトル、URL、および文字セットを定義します。
- 27行目 ― 配列
$entries
を、配列$rss
のentries
インデックスに割り当てます。これにより、配列$entries
の各要素がRSSの項目として定義されます。 - 31行目 ― RSSフィードを生成します。
- 34行目 ― フィードを変数に保存します。
- 37~39行目 ― フィードを誰でもアクセスできるファイルに書き込みます。
ちなみに、このフィードにはGameNomad: Popular Gamesでアクセスできます。このフィードをGoogle Readerに読み込むと、図1のような出力が表示されます。