過度なxml-rss2.phpへのアクセス対策
アクセスログを確認するとxml-rss2.phpへのアクセスが異常に多いことがあります。
xml-rss2.phpの処理時間も結構なものです。その原因と対策方法をメモします。
原因
別記事『アクセスしていないページがログに記録される?』にも記述しましたが、Firefox 1.5.0.10の先読み機能によって『xml-rss2.php』へ頻繁にアクセスが発生しているようです。
Windows版FireFox 2.0.0.2では同現象は発生しませんでした。
対策
対策として2つ考えました。
1.xmlj-rss2.phpの結果をNP_EzCacheでキャッシュすることでサーバへの負荷を減らす。
2.FireFoxが先読みの際に送信してくる『X-moz: prefetch』を判定し、Nucleus側でブロック処理を行なう
事項2については、先読みブロック処理の際にどの様なレスポンスを返却するのが正しいのか?の判断ができなかったので事項1で対策を進めることにしました。
NP_EzCacheでサーバ負荷軽減
NP_EzCacheをインストールしてxml-rss2.phpをキャッシュさせることで、3秒かかっていた処理時間が0.6秒程度になりました。
別記事『Nucleusの高速化(NP_EzCache編)』も参考にして下さい。
gzip圧縮で転送量軽減。
私の環境ではxml-rss2.phpに1行追加するだけでgzip圧縮送信が可能になりました。
53.28 KB であった送信データが9.93 KBになりました。
思ったより処理時間には影響しないので、転送量が気になる方はxml-rss2.phpをgzip送信対応にするのもお勧めです。
修正方法は『ob_start ( "ob_gzhandler" );』を適所に追加するだけです。
ob_gzhandlerはクライアントの圧縮送信不可を判断して自動的に、圧縮、非圧縮を行なってくれる優れものです。
私の開発環境、本番環境では問題無く動作してますが、ご利用は自己責任でお願いします。
xml-rss2.php抜粋
// compare Etag to what we got
if ($eTag == serverVar('HTTP_IF_NONE_MATCH')) {
header("HTTP/1.0 304 Not Modified");
header('Content-Length: 0');
} else {
$feed = mb_convert_encoding($feed, "UTF-8", "EUC-JP");
header("Content-Type: application/xml");
ob_start ( "ob_gzhandler" );
// dump feed
echo $feed;
}
PHPがZlibサポート状態でないとgzip圧縮送信はできません。
PHPの設定(output_handler等)やApacheの設定(mod_gzip等)によっては上手く動作しないかもしれません。
私の環境ではoutput_handler無し、mod_gzip無しです。
参考
圧縮送信されているか?の判断はFireFoxのメニューバーから『ツール→ページの情報』とたどり『一般タブ中のサイズ』で参照できます。
http://yoursite/xml-rss.phpとしてアクセスしてサイズを確認してみて下さい。
サイズ欄には実際に受信した際のサイズが表示されています。