この記事では、アンテナサイトの作り方をご紹介しています。「泉アンテナ」というアンテナを画像掲示板の泉につけてありますので、アンテナサイトがどういうものか分からない方はまずご確認下さい。
作り方の流れとしては、更新頻度の高いまとめサイトで気に入ったところからRSSを取得し、取得した記事情報をPHPでパースしてDBにためて、更新日時順に新しいものから表示をすれば完成となります。
とはいえ、一つのサイトからRSSを取得するだけでも数秒はかかってしまうため、取得するRSSが増えれば増えるほど処理時間の問題が発生してしまいます。そこで、各サイトのRSSパース処理を、php.iniのmax_execution_timeにかからないよう対応した方法についてご紹介したいと思います。
まとめアンテナサイト
「画像掲示板の泉」には2chのまとめサイトを更にまとめた、「泉アンテナ」というアンテナ機能をオマケで付けてあります。画像掲示板への書き込みネタ探しに使えるのでは?と思い、数年前から掲示板に付けてありましたが、未だ掲示板への書き込み数は増えないものの、アクセス数は次第に増えているので、こちらの方がメインコンテンツになっているのではないかと思っておりました。
まとめアンテナとは
「アンテナサイト」をご存知ない方は、ひとまず「泉アンテナ」をご覧いただければ似たようなサイトを見たことあると感じるかもしれません。2ちゃんねるやツイッターなどをまとめた「まとめサイト」を更にまとめたRSSリーダーのようなサイトがアンテナサイトになります。
アンテナサイトの作り方は色々あると思いますが、泉アンテナの場合はこのような感じで作ってあります。
アンテナサイトの作り方
- PHPで複数のまとめサイトからRSSを読み込む
- 取得した記事情報は全てDBにためこむ
- 日時順に新しいものから表示する
- 記事のクリック数もカウントを取りランキングで表示
今時、アンテナサイトの作り方に興味がある人はいないと思いますが、もし興味がある方がいらっしゃいましたら、コメントかTwitterで一言ご要望ください。まとめサイト側RSSをパースしてDBに取り込み、日時順に出力をして記事一覧を更新といった処理のサンプルコードをご紹介したいと思います。
取得したデータ件数
取得したRSSの記事公開時間をみていると、頑張っているところだと30分に一回くらいは新しいまとめ記事がでていたりするので、上記1のRSS取得を1時間に一回クロールするだけでも、結構な数の新着記事を収集することができております。
アンテナサイトの作り方に書いた1~4は、全てcronで自動化ができるので、泉アンテナでもcronでバッチ処理化をして放置しておりました。
ログを見ると2016-01-17 23:15:38からスタートして、今日の時点で791,446 件もの記事データがDBにたまっておりましたので、今日までの1,457日間を休まず動いていたことを考えると、日に543件も記事情報を収集できていたようです。
複数のサイトからRSSを取っているとはいえ、これだけのまとめ記事を作っているとは、まとめサイト運営者さんのパワーも凄いものを感じます。
PHP処理時間の制限
cronで走らせているPHPのRSSデータ取得プログラムをメンテナンスしてみることにしました。
新たにRSS取得先を増やしてみましたが、配信先情報をマスターにセットして処理プログラムを走らせてみましたが、504 gateway time-out nginxが表示されて止まってしまいました。
どうやら処理時間が長すぎて、php.iniのmax_execution_timeに引っかかったということのようです。
とはいえ、RSS取得先の数を3~4サイト増やした程度ですので、この状況からすると、これまでもバッチ処理はかなりコケていたことがあったのかもしれません。
まとめサイト別処理時間
試しに、1サイト毎に走らせてみたところ、このような感じになりました。
サイト | 処理時間 |
---|---|
サイト1 | 6s |
サイト2 | 9s |
サイト3 | 10s |
サイト4 | 9s |
サイト5 | 12s |
サイト6 | 9s |
サイト7 | 25s |
サイト8 | 9s |
サイト9 | 9s |
サイト10 | 13s |
サイト11 | 3s |
サイト12 | 2s |
サイト13 | 23s |
サイト14 | 2s |
サイト15 | 23s |
サイト16 | 9s |
サイト17 | 24s |
サイト18 | 6s |
サイト19 | 8s |
サイト20 | 10s |
サイト21 | 30s |
サイト22 | 24s |
サイト23 | 23s |
サイト24 | 13s |
サイト25 | 22s |
サイト26 | 7s |
サイト27 | 6s |
サイト28 | 24s |
サイト29 | 6s |
サイト30 | 13s |
総処理時間と解決策
多少時間のかかるサイトもありますが、RSSを丸っと読み込んでDB更新をかけて出力用HTMLを更新するところまでやってこのレベルなら、特に問題はなさそうです。
とはいえ、30サイト全部を合わせると389秒ということで、7分近くは走ることにはなるので、チリも積もればなんとやらという感じで、この処理時間の長さはさすがに問題がありそうです。
仕事であれば、バッチ処理をチューニングといった感じになりそうですが、さくらサーバでcronを5個以上追加する方法を以前書いたように、cronの追加はまだ可能そうでしたので、RSS取得の処理を15サイト毎の2本に分け、合わせて、これまでセットにしていた記事情報の出力処理も別処理として、3バッチにしたところ、問題なく定時処理をさせることができました。
おわりに
元々、「画像掲示板の泉」があまりにも過疎っていて書き込みが増えないので、画像掲示板への書き込みネタ探し用としてオマケで付けたアンテナ機能でしたが、私自身、画像掲示板よりこのアンテナ部分を見る方が楽しくなってしまいました。残念な感じです。