キャッシュ方法を変更

おいしいアンテナは、RSSの情報を整形して表示しているサービスで、数十個のRSScurlし、パースしています。
ユーザからアクセスがある度に、それらを行っていては、パフォーマンスがすごく悪くなるため、事前にrssに対してcurlとパースを行い、APCにキャッシュしています。
つまり、
定期的に RSScurlを行い、APCにキャッシュを行うプロセスが存在します。
ユーザからのアクセスは、APCからデータを取り出すだけなので、レスポンスが早いです。

    • -

背景の説明おわり。



最近スリープを挟みながら、はてブ数もキャッシュするようにしたため、以下のログが落ちるようになった。

PHP Fatal error:  Maximum execution time of 30 seconds exceeded

実行に30秒以上かかるのが原因。


これは、

/etc/php5/apache2/php.ini

max_execution_time = 30

を増やせば、実行時間が増えるため、とりあえずこの問題を回避できるようになる。
もっというと、設定ファイルで値を大きくするより、

set_time_limit()

http://jp2.php.net/set_time_limit
を使って、処理に時間がかかるプログラムだけの実行時間を大きくした方がいいっぽい。



でも、これはあくまで応急処置な感じがして、apacheのプロセスがずっと実行されているのって気持ち悪い。
そこで、

キャッシュ処理をapacheのプロセスだけで行うのではなく、curlcli側、APCへの保存をapache側で行うように改修した。

こういう感じ

       |  RSScurl
cli    |  curl 結果を パース
       |  パース結果をローカルファイルに保存

だいたい3分後

apache |  ローカルのキャッシュファイルを読み込み
       |  データを APCに保存

すべてcliで完結させずに、わざわざapacheのプロセスとしてPHPを実行している理由は、

  • > APCにキャッシュを行うためには cli 側からでは無理で、apacheのプロセスとしてphpを実行する必要があるっぽい。


あと、ローカルにファイルとしてキャッシュを行っているため、ゴミがたまる。そのゴミはクーロンで掃除するようにした。

5 4 * * * find /var/cache/fcache -mtime +2 -exec rm {} \;


参考にさせて頂きました。
http://www.asahi-net.or.jp/~aa4t-nngk/php4.html#ininote