押入れ起業

ガレージベンチャー、ならぬ。サボっていましたが再開します。

MagpieRSSの使い方を自分のためにメモ

      2015/04/08

今更だけど、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のなかのRSSAtomだけが対象となっている。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行目辺りから。

 - PHP , ,

応援クリックお願いします:

PC

PC

Comment

  1. GGG より:

    はじめまして、MagpieRSSを使ったアンテナサイトを運営していて動作が重い原因を探していたところこのブログに辿り着きました
    全てのサイトのキャッシュが同時に切れてまとめて取得しにいってるせいだったんですね…
    もし解決方法が分かりましたらブログで記事にして頂けると嬉しいです、よろしくお願い致します

  2. このブログの人 より:

    試していませんが、アンテナとは別に監視先RSSのうちランダムに1つだけ選んで取得するスクリプトを作り、それをCronで実行するなり、IFTTTに定期的にアクセスさせるなり、あるいはそのアンテナサイトへ頻繁にアクセスがあるならHTMLに1pxの画像として埋め込んで起動させるというのはどうですかね。
    キャッシュファイルの作成時間がずれていくので、新規取得がかさなって重くなることがなくなるのではないかと思います。

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

PHP
ヒアドキュメントに気をつけろ!なぜかエラーが出る場合…

ヒアドキュメントを使ってみたら何故か意味不明な、異常に長いエラーが出たぜ。 Pa …

PHP
PDOでSQLiteの研究(1)

最近は電脳卸の研究が止まっているが、いろいろ忙しく。でもやりたい事はいろいろある …

piwik
Piwikの手動アップデート

少し前からPiwikのアップデートが来ていたのだけれど、いつもどおり自動アップデ …

daterss
アクセスした日時を返すだけのRSSウェブサービスを作った

電脳ウェブサービスをやると言って、んでいよいよhtmlへはめ込む段階で今度はBo …

PHP
PHPで画像に文字列を描画する関数 imagefttext、描画する文字列の描画サイズを取得する関数 imagettfbbox

言いたいことはタイトルの通り。 imagefttext という関数を使うと画像に …

piwik
PHP/MySQLで動くオープンソースのアクセスログ解析「Piwik」の素晴らしい点

先日ちょろっと書いたけど、Piwikというアクセス解析のPHPスクリプトが実にい …

PHP
PHPでリファラ(参照元)をチェックするのはこれでいいの?

あるサイトでのページでフォーム入力し、そのサイト内の別ページへポストして結果を表 …

PHP
PHPでURLクエリのパラメータを連想配列にする/連想配列からURLクエリを作る

URLクエリのパラメータを連想配列にする parse_str – 文 …

PHP
ImageTTFTextで同じフォントを使ってもサーバによって文字サイズやアンチエイリアスが違う…

全く同じスクリプトと同じIPA明朝フォントファイルを使い、サーバーだけ変えてIm …

PHP
PHPでxmlデータを取得する

simplexml_load_file($url); – XMLファ …