キャッシュ方法を変更
おいしいアンテナは、RSSの情報を整形して表示しているサービスで、数十個のRSSをcurlし、パースしています。
ユーザからアクセスがある度に、それらを行っていては、パフォーマンスがすごく悪くなるため、事前にrssに対してcurlとパースを行い、APCにキャッシュしています。
つまり、
定期的に RSSにcurlを行い、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のプロセスだけで行うのではなく、curlをcli側、APCへの保存をapache側で行うように改修した。
こういう感じ
| RSS に curl cli | curl 結果を パース | パース結果をローカルファイルに保存 だいたい3分後 apache | ローカルのキャッシュファイルを読み込み | データを 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