アンテナサイトで使える?複数のRSSフィードを画像URL付で収集

アンテナサイトで使える?複数のRSSフィードを画像URL付で収集

ちょっと仕事で複数RSSフィードをまとめて表示するってのがあったのでなんとなく書いておく。

サンプルとやってみたこと

実際制作したものとは違うが、こちらにキャッシュ付で且つ並列処理でスピードもそれなりに考慮されたよいサンプルがあったのと、とにかく説明がめんどくさいので拝借。そちらを先に読んでください。

PHPなんてほぼ弄ったことないのでかなり無理矢理だが、各記事内の最初の画像URLも取得して、ついでに画像が無かった場合にYOUTUBE動画が埋め込んであった場合はそのサムネイルURLを取得するというのをやってみた。XMLフィードも一応対応したつもり。

このままでは何十個もフィードを登録するとスピード的にどうかと思うがそれは締めに記すとして、知識が私並みでこれから「アンテナサイト」などを制作しようとされている方は少し楽になるのかなと。

phpソース

補足と解説

基本的にネタ元のままですが、後であれ?みたいのもありますので解説と併せて記します。

  • キャッシュ関連はネタ元を参照ください。ただし私の都合で13行目のキャッシュディレクトリ名を変更しています。ここは適当ください。
  • 14行目:キャッシュのライフタイムが60時間になってるのでdemoとダウンロードファイルは1時間に修正してます。
  • 42〜44行目:出力時のhtmlコードで時間に<time>タグを使いたかったのでこんなややこしい事になっています。実際にブラウザで表示されるのは42行目の部分なので表示方法はご自由に。例えば”Y/m/d”にするとか。
  • 46行目:タイトルの文字数を制限する場合のコードです。
  • 52〜80行目:画像取得です。要するに<img>を探しているだけです。
  • 62行目〜:youtube用です。今後埋め込みコードに変更が合った場合はここも要変更となります。
  • 72行目:サムネイル取得用urlを記しています。今後変更になる可能性があるのでその場合はyoutube側でなにか用意すると思います。
  • 78行目:画像もyoutube埋め込みもない場合の仮画像のパスです。
  • 83〜90行目:出力用ですのでサイトに合わせて編集してください。
  • 109行目:このプログラムのみで完結してるので基本的なhtnlを入れて出力しています。実際にはhtnlやheadなどは別ファイルで制作してそこにこのコードを差し込んで使うのが楽だと思います。その場合はこの行は削除してください。
  • 114行目〜:フィード並列呼び出しのおまじないらしい。触れる必要も考える必要もありません。

feedの情報で画像を扱う場合の注意

このサンプルは<img>を拾うだけなのだが、そもそも有名なニュースサイトなど、アクセス数の多いサイトのフィードには<img>を入れていない場合が多いので集めるフィードは限られる。

元の記事にアイキャッチや文中の画像などがあっても<img>を含まないように調整されてるようだ。理由は、他人のサイトから画像を引っ張られてサーバに付加をかけないため。ライブドアとかフリーブログ系なら大丈夫だと思う。

大量のフィードを扱う場合は工夫が必要

元ネタには並列呼び出しで処理時間短縮を謳っているようでたしかに10個くらいならこのサンプルで問題ない。ただ、それ以上に大量のフィードを集めるとなるとスピード的にどうかと思う。

一応キャッシュを使っているといっても、全てのフィードを嘗めて回るのだからそれなりの時間がかかるし、そこは相手側のサーバなのでこちらではコントロール出来ない部分だ。

このサンプルではアクセスしたときにフィードを比較・収集するので、実際には閲覧者が更新していく事になり時間がかかるということ。利用者にとってのストレスとなる。

解決策としてはとってもシンプルでこのサンプルの「収集・キャッシュ書き込み部分」と「書き出し部分」を分けて2つにする。前者を、大抵のレンタルサーバーで使えるcronを使い、例えば10分おきに自動実行しておく。閲覧者がアクセスしたときは単に保存してあるキャッシュデータを読み込むだけにする。

感覚だけど、めちゃくちゃ軽くなると思う。最新情報では無くなってしまうが10分程度のタイムラグは良いのでは無いかな。