押入れ起業

ガレージベンチャー、ならぬ。もっぱらPHPプログラミングとアフィリエイトの研究をしています。

PHP

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

投稿日:2015-03-12 更新日:

今更だけど、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行目辺りから。

PC

PC

-PHP
-, ,

執筆者:


  1. GGG より:

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

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

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

comment

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

関連記事

さくらのレンタルサーバー

phpinfo()のdate項目、phpスクリプト中のdate()関数にwarning警告が出た(さくらのレンタルサーバー)

さくらのレンタルサーバで、phpinfo()表示やdate()関数を使っていたら警告が表示されていて不安になった。 Warning: phpinfo(): It is not safe to rely …

PHP

‘http://’. $_SERVER[‘HTTP_HOST’]; も header(‘Location: ./’);相対指定もやってはいけない事だった

$_SERVER[‘HTTP_HOST’]でリンク先を作るのも、header(‘Location:~’);のアドレス相対指定転送も、やってはいけないこと …

PHP

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

URLクエリのパラメータを連想配列にする parse_str – 文字列を処理し、変数に代入する 連想配列からURLクエリを作る http_build_query – URL …

piwik

PHP/MySQLで動くオープンソースのアクセスログ解析「Piwik」を削除した

PHP/MySQLで動くオープンソースのアクセスログ解析「Piwik」を削除した。アクセスログが溜まりすぎたからだ。 元々Piwikを導入したのは、(1)外部のアクセス解析サービスを使うとその重さに引 …

daterss

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

電脳ウェブサービスをやると言って、んでいよいよhtmlへはめ込む段階で今度はBootsTrapだと言って、それ以降更新してなかったが実はCSS2やCSS3の本を読んでいる途中という脇道から反れ反れでは …

open all | close all
open all | close all