PEAR Cache_Liteでmixhostでキャッシュを作るサンプルPHP
PEARライブラリの Cache_Lite を使ってキャッシュを作る基本的な方法。速くて安全・軽量のCache_Liteを使ってページ全体をキャッシュとかそんな大きなキャッシュを作るのではなく、ページのパーツ毎、関数単位でキャッシュするといった使い方を想定。レンタルサーバーはミックスホスト使用
Cache_Lite ページキャッシュよりデータやパーツのキャッシュに使う
キャッシュといえばどうしてもページ全体のキャッシュを考えると思うし、サイトの表示速度を上げる効果があるのはやはりページキャッシュの方だと思う。じゃあなんでページキャッシュに使わないのかというと、キャッシュがらみで障害てのが結構あるし管理がむずかしい。リアルタイムで流したい情報なんてのもページ単位で丸ごとキャッシュしてるとタイムラグが生じる。
現在、MixHostというレンタルサーバーを使っているのだが、LiteSpeedサーバー専用のWordPressキャッシュプラグイン LiteSpeed Cache というプラグインがあって他サイトで使っている。そのサイトは動的コンテンツもなく、解説や説明、ノウハウなど静的コンテンツがメインのサイトなのでページキャッシュがかなり有効。LiteSpeed Cacheの威力を存分と味わっている。
何が言いたいかというと、動的なコンテンツは動的に見せたいでもページスピードもあげたい、なので部分的にキャッシュ、関数にわたすデータをキャッシュするなどのために Cache_Lite を使ってみたいと思ったわけだ。
例えば、Webサービス APIで動的なコンテンツを動かしてる場合、リクエストに対してレスポンスのXMLファイルなんてのが返ってくる。そのXMLファイルをキャッシュしておけばページキャッシュほどではないが、リクエスト回数が減る分ページスピードがあがったり、何度もレスポンス待ちなんてことも少なくなったりする。またWebサービス APIではリクエスト回数が制限されていることも多く、そんな時にもリクエスト回数の削減にもつながる。
ということで前置きがうだうだと長くなったが、Cache_Lite の基本的な使い方についてキャッシュサンプルPHPコードで備忘録。
Cache_LiteでキャッシュサンプルPHPコード
とりあえず、Package Information: Cache_Lite でCache_Liteをダウンロードしてきて解凍、解凍してできたフォルダの中に「Cache」フォルダがあるのでCacheフォルダごとサーバーの任意のディレクトリにアップロードしておく。
次にキャッシュファイル保存用にディレクトリを作成しておく。ディレクトリには 書き込み権限(0777)を与えておくこと。ちなみに私は「cache-temp」とした。
当然PEARのキャッシュライブラリなので 肝心要の PEAR本体 もサーバーにインストールされていて、読み込める状態であり読み込む必要がある。
ちなみに、mixhost ではサーバー管理画面の cPanel の「ソフトウェア PHP PEAR パッケージ」からもCache_Liteをインストールすることができる。
Cache_Lite サンプル1 アクセスがあった時間を30秒間キャッシュする
<?php
// Cache/Lite.phpを読み込むパスでたらめ
require_once('../../パス/Cache/Lite.php');
// キャッシュディレクトリ
$cache_base = dirname(__FILE__) . "/cache-temp/";
// キャッシュディレクトリが存在しない場合は作成
if (!file_exists($cache_base)) {
mkdir($cache_base, 0777);
}
$options = array(
'cacheDir'=> $cache_base , // キャッシュディレクトリ
'caching' => 'true', // キャッシュを有効に
'automaticSerialization' => 'true', // 配列保存可能
'lifeTime' => 30, // 30秒で終わり
'automaticCleaningFactor' => 20, // 20分の1で自動クリーニング
'hashedDirectoryLevel' => 1, // ディレクトリ深さ(浅いが速い)
);
$cache = new Cache_Lite($options);
// キャッシュ有無確認
if ( $cache_data = $cache->get($cache_id) ) {
echo "キャッシュは生きてます<br>";
$output = $cache_data;
}
// キャッシュがないからデータ作成処理 キャッシュ作成
else
{
date_default_timezone_set('Asia/Tokyo');
$read_data = date('Y/m/d H:i:s');
echo "キャッシュがないから今作りました<br>";
$output = $read_data;
$cache->save($output);
}
echo $output;
?>
Lite.php を読み込む。4行目から9行目はキャッシュファイル保存用のディレクトリ作成済みならいらない。cache-tempがなかったら書き込み権限付きで作成。
10行目から17行目、Cache_Lite が作成するキャッシュのオプション。内容はコメントのとおり。最低、cacheDir lifeTime だけ設定すれば動くかも。
20行目、キャッシュファイルがあったなら「キャッシュは生きてます」と出力、キャッシュの内容を $output に入れとく。$cache_id は複数の関数(パーツ)で同じ保存ディレクトリを使うなら関数毎(パーツ毎)につけておいた方がいいかも。
27行目、キャッシュがないのでプログラムを書いてキャッシュしたいデータを作成。「キャッシュがないから今作りました」と出力、アクセスがあった時間を取得して$outputに入れとく。
31行目、$cache->save($output) でキャッシュ作成保存。33行目でキャッシュの有無で条件分岐した $output を出力。
実際の挙動は下のサンプルページ。キャッシュが作成されてから30秒以内にリロードすればキャッシュが表示されるはず。30秒以上経過すると新しくキャッシュが生成される。
Cache_Lite サンプル2 ランダムバナーを30秒間キャッシュ
<?php
// Cache/Lite.phpを読み込むパスでたらめ
require_once('../../パス/Cache/Lite.php');
// キャッシュID
$cache_id = "v2";
// キャッシュディレクトリ
$cache_base = dirname(__FILE__) . "/cache-temp/";
// キャッシュディレクトリが存在しない場合は作成
if (!file_exists($cache_base)) {
mkdir($cache_base, 0777);
}
$options = array(
'cacheDir'=> $cache_base , // キャッシュディレクトリ
'caching' => 'true', // キャッシュを有効に
'automaticSerialization' => 'true', // 配列保存可能
'lifeTime' => 30, // 30秒で終わり
'automaticCleaningFactor' => 20, // 20分の1で自動クリーニング
'hashedDirectoryLevel' => 1, // ディレクトリ深さ(浅いが速い)
);
$cache = new Cache_Lite($options);
// キャッシュ有無確認
if ( $cache_data = $cache->get($cache_id) ) {
echo "キャッシュは生きてます<br>";
$output = $cache_data;
}
// キャッシュがないからデータ作成処理 キャッシュ作成
else
{
date_default_timezone_set('Asia/Tokyo');
$read_data = date('Y/m/d H:i:s');
echo "キャッシュがないから今作りました<br>". $read_data;
$add_rand = array(
/* PHP7+MariaDB/MySQLマスターブック */ 'ここにバナータグ',
/* 詳細! PHP 7+MySQL 入門ノート */ 'ここにバナータグ',
/* いちばんやさしい PHP の教本 第2版 */ 'ここにバナータグ',
);
$add_rand = $add_rand[mt_rand(0, count($add_rand)-1)];
$output = $add_rand;
$cache->save($output);
}
echo $output;
?>
5行目、$cache_id = “v2" とキャッシュIDを指定してるのと、バナーをランダムに選択してキャッシュするデータを作成しているところ以外はサンプル1と同じ。まあランダムバナーをキャッシュて意味ないように思えるがサンプルということで。
サンプル1と同じキャッシュ保存用ディレクトリを使用しているのでキャッシュIDを指定している。キャッシュIDを指定しないとサンプル1のキャッシュを表示してしまうこともある。キャッシュ保存用ディレクトリを別途作成指定する方法もあるがIDを指定した方が早い。
ランダムバナー抽出処理の詳細は、「WordPress カスタムフィールド値指定ランダムバナーウィジェットの作り方」の バナー広告リストPHPテンプレートパーツ を参照。パーツをキャッシュするところに意味があるかも。
実際の挙動は下のサンプルページ。キャッシュが作成されてから30秒以内にリロードすればキャッシュが表示されるはず。30秒以上経過すると新しくキャッシュが生成される。