- ぱふぅ家のホームページ RSS
- ぱふぅ家のサイバー小物 RSS
- ローカルニュースの旅 RSS
目次
サンプル・プログラムの実行例

サンプル・プログラム
viewRSS.php | サンプル・プログラム本体。 |
pear/XML_RSS
このサンプル・プログラムは当初、MagpieRSS というオープン・ソースのRSSパーサを用いていたが、PHP8対応するためにはソースのあちらこちらを修正しなければならないことが分かり、pear/XML_RSS に乗り換えることにした。

PEAR パッケージのインストールについては、「PEARのインストール」などを参考にしてほしい。ここでは、pear/XML_RSS がインストールされたという前提で話を進める。

まず、PHP8対応にするため、若干の修正が必要だ。
"RSS.php" および "Parser.php" について、"startHandler($xp, $elem, &$attribs)" を検索する。この第3引数を値渡し "$attribs" に変更する。
startHandler($xp, $elem, &$attribs)これは、PHP8で値渡しになったための修正だ。
↓
startHandler($xp, $elem, $attribs)
サンプル・プログラムの流れ

画面は、大きく2つのブロックに分かれる。RSSのURLを入力するためのINPUT部と、RSSを解釈した結果を表示するBODY部である。プログラムの流れとしては、URLが入力されたらBODY部を表示するようにする。

そこで、最初はINPUT部のみ表示しておき、[取得]ボタンが押されたら、URLの値をGET渡しする。もしGET渡しされた値があったら、BODY部を表示するようにする。

解説:初期化処理
0014: // 初期化処理 ================================================================
0015: define('INTERNAL_ENCODING', 'UTF-8');
0016: mb_internal_encoding(INTERNAL_ENCODING);
0017: mb_regex_encoding(INTERNAL_ENCODING);
0018: define('MYSELF', basename($_SERVER['SCRIPT_NAME']));
0019: define('REFERENCE', 'https://www.pahoo.org/e-soul/webtech/php02/php02-02-01.shtm');
0020:
0021: //プログラム・タイトル
0022: define('TITLE', 'RSSビューア');
0023:
0024: //リファラチェック+リリースフラグの設定
0025: if (isset($_SERVER['HTTP_HOST']) && ($_SERVER['HTTP_HOST'] == 'localhost')) {
0026: define('FLAG_RELEASE', FALSE);
0027: define('REFER_ON', '');
0028: ini_set('display_errors', 1);
0029: ini_set('error_reporting', E_ALL);
0030: } else {
0031: //リリース・フラグ(公開時にはTRUEにすること)
0032: define('FLAG_RELEASE', TRUE);
0033: //リファラ・チェック(直リン防止用;空文字ならチェックしない)
0034: define('REFER_ON', 'www.pahoo.org');
0035: }
0036:
0037: //表示幅(ピクセル)
0038: define('WIDTH', 600);
0039:
0040: //RSS URL(初期表示用)
0041: define('DEFURL', 'https://www.pahoo.org/rss/pahoo.rdf');
0042:
0043: //pear/XML_RSS https://pear.php.net/package/XML_RSS
0044: require_once('XML/RSS.php');

定義済み変数 $_SERVER['SCRIPT_NAME'] には、このPHPスクリプト自身の実行パスとファイル名が格納されている。のちほど使うことになるので、関数 basename によりスクリプト・ファイル名のみ取り出し、定数 MYSELF に格納しておく。

関数 require_once を使って pear/XML_RSS を読み込む。
PEAR パッケージは include_path にあるという前提である。
解説:引数取得
0114: /**
0115: * 指定したパラメータを取り出す
0116: * @param string $key パラメータ名(省略不可)
0117: * @param bool $auto TRUE=自動コード変換あり/FALSE=なし(省略時:TRUE)
0118: * @param mixed $def 初期値(省略時:空文字)
0119: * @return stringパラメータ/NULL=パラメータ無し
0120: */
0121: function getParam($key, $auto=TRUE, $def='') {
0122: if (isset($_GET[$key])) $param = $_GET[$key];
0123: else if (isset($_POST[$key])) $param = $_POST[$key];
0124: else $param = $def;
0125: if ($auto) $param = mb_convert_encoding($param, INTERNAL_ENCODING, 'auto');
0126: return $param;
0127: }
0103: /**
0104: * 指定したボタンが押されてきたかどうか
0105: * @param string $btn ボタン名
0106: * @return bool TRUE=押された/FALSE=押されていない
0107: */
0108: function isButton($btn) {
0109: if (isset($_GET[$btn])) return TRUE;
0110: if (isset($_POST[$btn])) return TRUE;
0111: return FALSE;
0112: }
解説:ヒアドキュメント
0175: $body =<<< EOT
0176: <body>
0177: <h2>{$title} {$version}</h2>
0178: <form name="myform" method="get" action="{$myself}" enctype="multipart/form-data">
0179: RSS URL
0180: <input type="text" name="uri" id="uri" size="50" value="{$url}" />
0181: <input type="submit" id="exec" name="exec" value="取得" />
0182: <input type="submit" id="reset" name="reset" value="リセット" />
0183: </form>
0184:
0185: {$table}
0186:
0187: <div style="border-style:solid; border-width:1px; margin:20px 0px 0px 0px; padding:5px; width:{$width}px; font-size:small; overflow-wrap:break-word; word-break:break-all;">
0188: <h3>使い方</h3>
0189: <ol>
0190: <li>[<span style="font-weight:bold;">RSS URL</span>]に表示したいRSSのURLを入力してください。</li>
0191: <li>[<span style="font-weight:bold;">取得</span>] ボタンを押してください。</li>
0192: <li>RSSの一覧が表示されます。</li>
0193: </ol>
0194: ※参考サイト:<a href="{$refere}">{$refere}</a>
0195: </div>
0196: </body>
0197:
0198: EOT;

たとえば、このサンプル・プログラムでは、"<<< EOT" の次の行から "EOT;" の直前行まで、そのままの形でユーザー変数 $body や $table に格納される。
また、ヒアドキュメントの中には、PHP変数や式を埋め込むことができる。ここでは、配列変数 $item や $uri などの値を埋め込んでいる。

同様に、HMTLのヘッダ部をユーザー変数 $HtmlHeader に、フッタ部をユーザー変数 $HtmlFooter に格納しておく。
解説:メイン・プログラム
$uri に値が入っていたら pear/XML_RSS のパーサー parse を呼び出す。
NULLが返っていたら、ユーザー変数 $errmsg にエラー・メッセージを格納する。

パーサーによって得られるRSSの内容は以下の通り。
0202: // メイン・プログラム ===================================================
0203: $rss = NULL;
0204: $errmsg = '';
0205: $rssonly = isButton('rssonly');
0206: $uri = getParam('uri', FALSE, DEFURL);
0207:
0208: //リセット
0209: if (isButton('reset')) {
0210: $uri = '';
0211:
0212: //RSS解釈と出力コンテンツ作成
0213: } else if ($uri != '') {
0214: $rss = new XML_RSS($uri); // pear/XML_RSS
0215: $rss->parse();
0216: if ($rss == NULL) $errmsg = 'RSSの解釈に失敗';
0217: }
0218:
0219: $HtmlBody = makeCommonBody($rssonly, $uri, $rss, $errmsg);
0220:
0221: // 表示処理
0222: if ($rssonly) {
0223: echo $HtmlBody;
0224: } else {
0225: echo $HtmlHeader;
0226: echo $HtmlBody;
0227: echo $HtmlFooter;
0228: }
0229:
0230: /*
<channel> | |
$rss->channel["title"] | タイトル。普通は親サイトのタイトル。 |
$rss->channel["link"] | |URL。普通は親サイトのURL。 |
$rss->channel["desctiption"] | channelに関する説明記述。 |
<item> | |
$item["title"] | itemのタイトル。 |
$item["link"] | itemのURL。 |
$item["desctiption"] | itemの簡単な記述/概要。 |
$item["dc"]["date"] | itemのタイムスタンプ(W3C形式)。 |
解説:表示処理
この時点で表示に必要な情報は次のユーザー変数に格納されている。
$HtmlHeader | HTMLヘッダ |
$HtmlBody | BODY部 |
$HtmlFooter | HTMLフッタ |
0225: echo $HtmlHeader;
0226: echo $HtmlBody;
0227: echo $HtmlFooter;
サンプル・プログラムの応用

このとき、INPUT部が表示される必要はないと思うので、rssonly オプションを追加した。
たとえば "viewRSS.php?rssonly&uri=[RSS URL]"と指定してやれば、スタイルシートは未定義で、INPUT部を表示しないRSSビューアとして機能する。

ぱふぅ家のホームページでは、最速セキュリティニュースで、サンプル・プログラムと同様のスクリプトを使っている。
Apache HTTPサーバの SSI の1つである "#include virtual" を利用し、RSSビューア・スクリプトをコンテンツの中に埋め込んでいる。
参考サイト
- pear/XML_RSS
- RSS -- サイト情報の要約と公開(The Web KANZAKI)
- PHPでRSSを作る:ぱふぅ家のホームページ
- PHPでRSSを作る(その2):ぱふぅ家のホームページ