ラベル cache の投稿を表示しています。 すべての投稿を表示
ラベル cache の投稿を表示しています。 すべての投稿を表示

2010年6月14日月曜日

PHPを mod_cache (mod_disk_cache)でキャッシュする

Apacheのmod_cacheとmod_disk_cacheを使って、PHPで生成したHTMLをキャッシュする方法のメモ。


Apacheの設定では、LoadModuleでmod_cacheとmod_disk_cacheを有効にする。
そして下記のようにキャッシュの設定をする。

CacheRoot /path/to/cache/dir
#キャッシュ方法と、キャッシュを有効にするURLの先頭部分
CacheEnable disk /test
#上記URLのうち、キャッシュを無効にするURL
CacheDisable /test/not_cache
CacheDirLevels 4
CacheDirLength 5
#クライアントの挙動に関わらずキャッシュを有効にする
CacheIgnoreCacheControl On


PHP側では下記のようにHTTP Response HeaderのLast-ModifiedとExpiresをセットする。(max-ageもセットした方がよい?)
$now = time();
$maxAge = 60;
header('Last-Modified: ' . gmdate('D, d M Y H:i:s T', $now));
header('Expires: ' . gmdate('D, d M Y H:i:s T', $now + $maxAge));
//header("Cache-Control: max-age=$maxAge");

これで60秒間、サーバサイドでもキャッシュされる。
同一クライアントからのアクセスなら、60秒間はクライアントキャッシュが有効。それでもGETしようとしてきた場合(Firefoxで更新ボタンをクリックした場合等)はmod_cacheが304を返してくれる。



PHPでHTTP Response Headerを指定しない場合は、Apacheのキャッシュ設定に下記を追加する。
CacheIgnoreNoLastMod On
CacheDefaultExpire 86400
#キャッシュから1秒以上過ぎたら1日キャッシュを有効にする場合はこんな値で
CacheLastModifiedFactor 86400
CacheMaxExpire 86400

これでHTTP Response Headerを指定しない場合でもサーバサイドのキャッシュが有効になったが、クライアントキャッシュは有効にならないのが残念。
気を利かせて適切なHTTP Response Headerをセットしてくれればいいのに。



キャッシュファイルは定期的にhtcachecleanで掃除する。
(空のディレクトリがうまく削除されない?)



参考

2009年2月11日水曜日

MySQLの query_cache_sizeのチューニング

query_cache_sizeに値を指定することで、MySQLのクエリーをキャッシュさせレスポンスを向上させる。
デフォルトはゼロ。(キャッシュしない。)

現在の状態は下記SQLで取得できる。

SHOW STATUS LIKE 'Qcache_%';

  • Qcache_free_memory・・・キャッシュの空き容量。足りなければ増やす
  • Qcache_lowmem_prunes・・・キャッシュの容量不足で削除されたクエリーの数。これが多い場合もキャッシュサイズを増やす
  • Qcache_free_blocks・・・断片化したキャッシュのブロック。これが多い場合は下記SQLで断片化を解消する(1になる)。
    FLUSH QUERY CACHE;


キャッシュに関する状態は、MySQL Administratorでも見られる。


参考:
 [ThinkIT] 第6回:query_cache_sizeの違いによるパフォーマンス比較 (1/3)
 もろもろメモ : MySQL cache "query_cache_size" の設定

PDOの Prepared Statementと MySQLの Query Cache

MySQL で prepared statement を使うと query cache が効かないらしいので調査。


MySQL 5.0と 5.1.17 より前(=5.1.16以前)では、サーバサイドのPrepared Statementを使うとQuery Cacheが使われない。
参考:
 MySQL :: MySQL 5.0 Reference Manual :: 7.5.4 The MySQL Query Cache
 MySQL :: MySQL 5.1 Reference Manual :: 7.5.4 The MySQL Query Cache
 [PHP] prepared statement - Usenet Forums


でも、PDOのPrepared StatementはQuery Cacheを使っていると言う人もいる?(MySQLは5.0)
PHPのPDO::mysql。prepared statementはquery cacheを使っている! | まつぼっくりんご


また、PDOのPrepared Statementはそんなに有用じゃないから、$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true) した方がいいとか、PDO::query() を使った方がいいと言う人もいる。
Using PDO::MYSQL ? - Evil, as in Dr.(→ 機械翻訳:PDOを使うこと:MYSQLに?-悪(博士の場合のように)。
PHP: PDO::prepare - Manual


試したかったが、手元の環境は最新の5.1だったから普通にCacheが使われていた。

2009年1月26日月曜日

Windowsに PHP eAcceleratorをインストールメモ

インストールのメモ。PHPは5.2.8。


インストール手順

  1. Apache on Windows binaries and modules downloadからZIPをダウンロード(現時点の最新版(5.2.8)にしか対応していない?)
  2. ZIPを解凍(展開)して、eaccelerator.dllをPHPのextフォルダに移動またはコピー
  3. ZIP内にあるcontrol.phpをWebブラウザで見られる場所に移動またはコピー(例:C:\apache\htdocs\test\control.php)
  4. control.phpの変数$userと$pwの値を適切なものに変える(この認証を使わないなら該当箇所をコメントアウトする)
  5. control.phpではshort_open_tagの"<?="を使ってるので、これを許可していない場合は"<?php echo "に置換する
  6. キャッシュ用のフォルダを作成(例:C:\temp\cache\ea)
  7. php.iniに設定を追加
    (例)
    [eAccelerator]
    extension="eaccelerator.dll"
    eaccelerator.allowed_admin_path="/apache/htdocs/test/control.php"
    eaccelerator.shm_size="64"
    eaccelerator.cache_dir="/temp/cache/ea"
    eaccelerator.enable="1"
    eaccelerator.optimizer="1"
    eaccelerator.check_mtime="1"
    eaccelerator.debug="0"
    eaccelerator.filter=""
    eaccelerator.shm_max="0"
    eaccelerator.shm_ttl="0"
    eaccelerator.shm_prune_period="0"
    eaccelerator.shm_only="1"
    eaccelerator.compress="0"
    eaccelerator.compress_level="9"
  8. Apacheを再起動
  9. control.phpにアクセス(4.で設定したユーザー情報でログインする)
  10. control panelがエラー無く表示されていればインストール完了



php.iniの設定について
  • [eAccelerator]は無くても良いがあった方がわかりやすい。
  • allowed_admin_path・・・手順3で移動したPHPのパス
  • shm_size・・・0にすると「デフォルト値」が適用される(手元の環境では32MBだった)
  • check_mtime・・・0にするとPHPを更新してもキャッシュをCleanするまで更新が反映されない
  • filter・・・キャッシュ対象を絞り込める
  • compress・・・1にすると圧縮するが、どちらがよいかは状況によるらしい



control.phpでの操作
  • Caching・・・キャッシュの有効/無効の切り替え
  • Optimizer・・・最適化の有効/無効の切り替え
  • Clear cache・・・キャッシュを全て削除
    Remove all unused scripts and data from shared memory and disk cache, this means all data that isn't used in the current requests.
  • Clean cache・・・期限切れのキャッシュを削除


    Remove all expired scripts and data from shared memory and disk cache.


  • Purge cache・・・削除対象としてマークされたキャッシュを削除?


    Removed all scripts that are marked for deletetion. This will happen automaticly when shared memory is needed.





使ってみた感想
control.phpでキャッシュされる様を眺めるのが楽しい。
WordpressとかCakePHPとか、ファイルサイズ大きすぎ。


それから、control.phpでやっている認証はBasic認証なので、気持ち悪かったらApacheでDigest認証やその他のアクセス制限をかけた方が良さそう。



参考

ブログ アーカイブ

tags