今更だけど、MagpieRSSの使い方を再確認。
Magpie RSS – PHP RSS Parser
MagpieRSS provides an XML-based (expat) RSS parser in PHP.
MagpieRSS is compatible with RSS 0.9 through RSS 1.0. Also parses RSS 1.0’s modules, RSS 2.0, and Atom. (with a few exceptions)
ブログやニュースサイト等に用意されているRSSとAtomのデータを簡単に扱えるPHPスクリプト。XMLデータ全般ではなく、XMLのなかのRSSとAtomだけが対象となっている。XMLを使うときはPEAR::Cache_Liteでどうにかすればいいんじゃないの。
MagpiRSSで使用するファイル
magpierss-0.72.tar.gzを解凍して、中にはいっているrss_cache.inc、rss_fetch.inc、rss_parse.inc、rss_utils.incの4つのファイルと、extlibフォルダを使用する。
そしてキャッシュ保存用のcacheフォルダを作成する。
MagpiRSSの設定
日本語の文字化けを防ぐためにrss_fetch.incの358行目を書き換えて…、キャッシュ保持時間を変更するには350行目を書き換えて…といった説明も見受けられるが、書き換えは不要だ。このブロックは「もし未定義なら、この値を定義する」という意味だ。だからMagpieRSSを使うとき(require_onceするとき)に、併せて定義(define)すればいい。
自分でrequire_onceするのはrss_fetch.incとrss_utils.incの2ファイル。rss_cache.incとrss_parse.incはrss_fetch.incからrequire_onceされる。
rss_utils.incはwc3dtfという日時フォーマットを読み込むためのものみたい。ここで作られた関数parse_w3cdtf()が、rss_parse.incの392行目、411行目で使われている。@でエラー非表示になっているので、無きゃ無いで動くようだけど。
rss_parse.incを修正する
キャッシュ取得時に非推奨エラーの警告が表示されるので、rss_parse.incの153行目、splitをexplodeに修正する。splitはPHP5.3.0で非推奨になっているので。
Function split() is deprecated ************/in rss_parse.inc on line 153
参考:MagpieRSS でエラー「rss_parse.inc on line 153」
修正前
list($ns, $el) = split( ':', $element, 2);
修正後
list($ns, $el) = explode( ':', $element, 2);
で、こんな感じに。
<?php // MagpieRSS // http://magpierss.sourceforge.net/ /* MagpieRSS設定 */ // MagpieRSSのファイルを置くディレクトリ define('MAGPIE_DIR', './magpierss/'); // 最後に / をつける // キャッシュディレクトリ define('MAGPIE_CACHE_DIR', './cache'); // キャッシュ時間(秒) define('MAGPIE_CACHE_AGE', 60*60); // 3600秒 // 文字コード指定 define('MAGPIE_OUTPUT_ENCODING', 'UTF-8'); // 日本語の文字化けを防ぐ // MagpieRSS読み込み require_once(MAGPIE_DIR.'rss_fetch.inc'); //rss_cache.incとrss_parse.incはここからrequire_onceされる require_once(MAGPIE_DIR.'rss_utils.inc'); // rssを1つだけ指定 $rss_url = 'http://news.livedoor.com/topics/rss/top.xml'; // データ取得 $result = fetch_rss( $rss_url ); // 表示チェック echo "<pre>"; var_dump($result); echo "</pre>"; ?>
複数のRSSをまとめて表示するアンテナを作るときは、監視するRSSのぶんだけループし、一旦配列に貯めてからソートして表示する。
でもこのままだと、取得した全てのRSSデータのキャッシュタイムが同時に切れるから、切れた後最初にアクセスするハズレを引いた人はすごく重いページ表示になる気がする。裏でRSSをランダム・個別に取得してキャッシュタイムをずらしたり、ループでRSSを個別に読むときにMAGPIE_CACHE_AGEの数値をランダムで崩してdefineを繰り返すとか…。
追記:キャッシュ時間はファイルごとに指定できるのではなく、RSSのURLをチェックするたびに作成日時から現在までの経過時間とdefineの値を比較し、キャッシュを利用するか新規取得するかを判断している。rss_cache.incの121行目辺りから。
はじめまして、MagpieRSSを使ったアンテナサイトを運営していて動作が重い原因を探していたところこのブログに辿り着きました
全てのサイトのキャッシュが同時に切れてまとめて取得しにいってるせいだったんですね…
もし解決方法が分かりましたらブログで記事にして頂けると嬉しいです、よろしくお願い致します
試していませんが、アンテナとは別に監視先RSSのうちランダムに1つだけ選んで取得するスクリプトを作り、それをCronで実行するなり、IFTTTに定期的にアクセスさせるなり、あるいはそのアンテナサイトへ頻繁にアクセスがあるならHTMLに1pxの画像として埋め込んで起動させるというのはどうですかね。
キャッシュファイルの作成時間がずれていくので、新規取得がかさなって重くなることがなくなるのではないかと思います。