サイトマップ結合プラグインからサイトマップページを作成してみようでサイトマップ結合プラグインで生成したXMLファイルを元にページに表示用のサイトマップを出力できたけど、都度生成だと表示速度が遅くて困る。

というわけで、

表示速度を上げる対応をしてみます。

対応を前に考えたこととして、

・サイトマップページは頻繁に更新されることはない

・閲覧者にも頻繁に確認されることはない

ということから、キャッシュの対応をしてみることにした。

前回のコードを下記の様に修正してみる。

if(isset($_GET["xml_search"])) return;

//キャッシュの設定
$cacheDir = _SITE_ROOT_ . "/.cache/soy_module/";
$cacheFile = $cacheDir . "cache_merge_sitemap_.html.php";

//今回のファイル用のディレクトリを作成しておく
if(!file_exists($cacheDir)){
mkdir($cacheDir);
}

//キャッシュファイルがなかった時は生成する
if(!file_exists($cacheFile)){
$xml = simplexml_load_string(file_get_contents("http://localhost/merge.xml"));

//念の為にXMLファイルにURLが格納されているか調べてからHTMLに出力する
$htmls = array();
if(count($xml->url)){
$htmls[] = "<ul>";
foreach($xml->url as $obj){
$html = @file_get_contents($obj->loc . "?xml_search");
if(is_null($html)) continue;
if(preg_match('/<title>(.*)<\/title>/', $html, $tmp)){
$htmls[] = "<li><a href=\"" . $obj->loc . "\">" . htmlspecialchars($tmp[1], ENT_QUOTES, "UTF-8") . "</a></li>";
}
}
$htmls[] = "</ul>";
}

$cache = implode("\n", $htmls);

//cacheっぽいファイルを生成する
file_put_contents($cacheFile, $cache);
}else{
$cache = file_get_contents($cacheFile);
}

echo $cache;

これで、一度サイトマップのHTMLを作成したら、二度目は一度目の表示の際に生成したキャッシュファイルを参照するので、XMLから全ページ調べながら生成という処理はなくなる。

//キャッシュの設定
$cacheDir = _SITE_ROOT_ . "/.cache/soy_module/";
$cacheFile = $cacheDir . "cache_merge_sitemap_.html.php";

このコードにより、

ようこそ、SOY CMSへの画面にあるキャッシュのクリアの機能が使える様になる。

※_SITE_ROOT_定数はフロントコントローラ(index.php)でサイトディレクトリの位置が定義されています

今のコードのままだと、サイトを更新する度にキャッシュのクリアをいちいち押さなければならず面倒なので、

キャッシュファイルに寿命を持たせてみる。

本来ならば何か更新がある毎にキャッシュを更新したいけど、

サイトマップはそこまで更新する必要はなさそうなので、

寿命は1日にしてみる。

if(isset($_GET["xml_search"])) return;

//キャッシュの設定
$cacheDir = _SITE_ROOT_ . "/.cache/soy_module/";
$cacheFile = $cacheDir . "cache_merge_sitemap_.html.php";

//今回のファイル用のディレクトリを作成しておく
if(!file_exists($cacheDir)){
mkdir($cacheDir);
}

//キャッシュファイルがあるか調べる
if(file_exists($cacheFile)){
$stat = stat($cacheFile);

//更新時間を調べて、本日でない場合はファイルを削除する
if($stat["mtime"] < strtotime("-1 day", time())){
unlink($cacheFile);
}
}

//キャッシュファイルがなかった時は生成する
if(!file_exists($cacheFile)){
$xml = simplexml_load_string(file_get_contents("http://localhost/merge.xml"));

//念の為にXMLファイルにURLが格納されているか調べてからHTMLに出力する
$htmls = array();
if(count($xml->url)){
$htmls[] = "<ul>";
foreach($xml->url as $obj){
$html = @file_get_contents($obj->loc . "?xml_search");
if(is_null($html)) continue;
if(preg_match('/<title>(.*)<\/title>/', $html, $tmp)){
$htmls[] = "<li><a href=\"" . $obj->loc . "\">" . htmlspecialchars($tmp[1], ENT_QUOTES, "UTF-8") . "</a></li>";
}
}
$htmls[] = "</ul>";
}

$cache = implode("\n", $htmls);

//cacheっぽいファイルを生成する
file_put_contents($cacheFile, $cache);
}else{
$cache = file_get_contents($cacheFile);
}

echo $cache;

キャッシュファイルを読み込むかどうかの直前でキャッシュファイルの寿命を調べて、

キャッシュファイルが古ければ削除するという仕様を追加した。

以上の対応を行った後、サイトマップページを開いてみると、

一回目は以前と同じだけど、

二回目は瞬速で表示された。