[Tep-j-general] 負荷の重いページをキャッシュする

アーカイブの一覧に戻る

hamada bungu****@leo*****
2008年 3月 12日 (水) 12:39:47 JST


こんにちわ。

負荷対策として

「クローラーに503を返す方法」

を暫く試してみてましたが、実際にやってみて解析したトコロ、

「やっぱりこれは色々とダメそう」

という事が、段々解ってきました。

激しくツっ込まれるのは、やはりそれなりの理由が有ったらしいです。考えが浅
かったです。どーも色々とすみません(^^;)

503を食らわせたら、更にハイペース化するとは…(^^;;

Google ウェブマスター ツールに

> 503 (サービスは利用できません)

がずらりと並ぶのもイヤだし。

当方はこの機会にApacheやMySQLの設定を見直しまして、こちらもそれなりの効
果が出ました。

# netstat -nt | grep -c ':80'

とかやって、記録されるHTTP接続数にちとビビったりとか。

で、今回はキャッシュを試してみました。

基本的に

[PHPプロ!] お手軽にページのキャッシュを行う方法
http://codezine.jp/a/article/aid/1027.aspx

↑コレ、そのままです。キャッシュを読む条件に「非ログイン時」とか一言付け
加えたり、URLをスクリプト名にしてるだけ。

キャッシュをスクリプト単位にしてるので、product_info.phpみたくパラメータ
を伴うファイルには対応しません。そういう仕様です。

osCだとall_productsみたいな、パラメータが無く、DB負荷が大で、頻繁に内容
が変わらず、閲覧頻度の高いページに向いてると思います。

この工事には(割と明瞭な)デメリットがありますので、適用する場合は、工事
内容を理解出来る方が自己責任でご導入ください。

当方はまったく責任を負えません。

そもそもDBキャッシュが効く環境なら、あまりメリットは無いかも。


導入手順>

1. キャッシュディレクトリ(例では/var/www/cache/)を777で掘る

2. /catalog/includesにstart_cache.phpとend_cache.phpを置く

3. キャッシュしたいファイルの

>   require('includes/application_top.php');

の直下に

>   include(DIR_WS_INCLUDES . 'start_cache.php');

を追記。

4. キャッシュしたいファイルの末尾に

> <?php include(DIR_WS_INCLUDES . 'end_cache.php'); ?>

を追記。


以上。


はまだ




start_cache.php
-----------------------------------------------

<?php
// キャッシュの設定
$settings_cachedir = '/var/www/cache/';
$settings_cachetime = 3600; // キャッシュの有効時間 3600秒(1時間)

$thispage = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
$cachelink = $settings_cachedir . md5($thispage) . '.html';
if (@file_exists($cachelink)) {
  $cachelink_time = @filemtime($cachelink);
  if ((time() - $settings_cachetime) < $cachelink_time && !tep_session_is_registered('customer_id')) {
    @readfile($cachelink);
    die();
  }
}
ob_start();
?>



end_cache.php
-----------------------------------------------

<?php
$fp = fopen($cachelink, 'w');
@fwrite($fp, ob_get_contents());
@fclose($fp);
ob_end_flush();
?>




Tep-j-general メーリングリストの案内
アーカイブの一覧に戻る