PHP でRSSを使った更新確認サイトを作る

Google のRSSのAPI廃止で、今、派遣先の大学で情報発信に使っているブログの更新状況が公式サイトでは見れなくなっています。

ネットでざっと見た限りでは同じ機能を PHP で簡単に作れそうでした。それで始めたのですが、予想外に手間がかかっています。まず、何がまずかったか。

・RSSのフォーマットは1つではない

ブログは WordPress だからと甘く見てたのですが、RSSを実装する方法はいくらでもあるようです。大学で使っているブログには、いろいろなバージョンの WordPress が使われており、プラグインも利用者が自由に決めています。そのせいでしょうか、確認した限りでは3通りのパターンがありました。

どうもよく知られているのが、「RSS2」というフォーマットを「Atom」というフォーマットの2つのようです。この2つには互換性がありません。

さらに、Atom の派生版があるようです。構造は、「Atom」のもののようですが、使われているタグが違っています。そのため、XML を読んだら、この3つの仕様に合わせて、内部を解析する必要がありました。

・とにかく遅い

Google API を使っいた時は、なんかもっさりしているな、くらいで済んでいたのですがPHP で毎回各サイトに RSS の問い合わせを行うと、異様に時間があかります。20秒から30秒、画面が更新しないのはかなり問題かと。

PHP の内部の XML 化処理に時間がかかっているのか、と思ってsimplexml_load_file() からXMLReader に変えてやってみたのですが、それほど効果hありません。RSS を取得する先が32箇所というのがネックになっている、と思うのですが、今のところお手上げ。

どうも、cURL というライブラリを使うとアクセス時間が短くなるらしいのですが、今回は、うまく作れませんでした。マニュアルでは並列処理することで処理時間を劇的に短縮できるのだそうです。そのうち試してみるつもりです。

・仕様もちょっと問題が

JavaScript から PHP に作り直しているブログの更新を紹介するページでは、ブログに貼り付けられた画像を縮小して、サムネイルとして利用しています。この画像を切り出す処理も手間取った1つ。

ブログは WordPress で動いているんだからなんとかなると思ったのですが、 WordPress のバージョンの違いで、HTML のタグ内の記述が少し違っているます。HTML のタグ内を解析するライブラリも探せばいいもがあるのかもしれませんが、どうせ簡単な文字列のマッチングで画像の URL を拾ってOK、という前提で始めたので、最初からガリガリ書いてました。

そしてこの処理で最後に困ったのは、src=./wp-contents/update …. を書かれたHTML。このパスの書き方は間違いなく WordPress ですが、相対記述の場合、URL を合成するのは面倒。私は、このケースでは記事の中の画像を利用するのをあきあらめました。

一応、テスト環境で動いていますが、あまりに遅いので、いまだに保留にしています。せめて、今の半分の時間で動いてくれれば、使えるレベルなのですが。

実は、MySQL に直接アクセスして最近更新のあった記事を調べた結果を表示するページが既にあります。このページはほんの数秒で表示してくれます。汎用性は落ちますが、こっちのやりかたで作り直すか。でも、別にいる管理者が簡単に、RSS で確認するページの追加や削除ができなくなるものダメだし。どうすれば、Google API を使っていた時みたいに、みんながハッピーになれるか、まだまだ思案中。