PHP数据查询缓存的实现(二)
此方案适合以相对时间收久的缓存,对于相对更新比较快,但也需要缓存提速的可以选择memcache
使用缓存:
要用缓存,你需要用函数unserialize()来使数据还原成原始格式与类型。
你可以用file_get_contents()这个函数来读取sql_cache.txt文件的内容,把它赋给一个变量。
请注意:这个函数在PHP4.3.0及以上版本有效。若你使用的是一个老版本的PHP,一个简单的方法是用file()函数(读整个文件到一个数组,每行变成一个数组)。implode()函数用于把数组的各元素连接成一个字符串然后使用unserialize()反序列化。
// file_get_contents() 适合于for PHP < 4.3.0
$file = 'sql_cache.txt';
$records = unserialize(implode('',file($file)));
现在你可以通过$records数组并且取得原始查询的数据:
foreach ($records as $id=>$row) {
print $row['category_name']."<br>";
}
注意$records是数组(一个包含了查询结果的数字索引列——每行是一个数字和一个字符串...真是混乱)的一排。
把它们放在一块:
基于本例子中的时间来决定是否缓存。如果文件修改的时间戳比当前时间戳减去过期时间戳大,那么就用缓存,否则更新缓存。
<!--[if !supportLists]-->l <!--[endif]-->检查文件是否存在并且时间戳小于设置的过期时间
<!--[if !supportLists]-->l <!--[endif]-->获取存储在缓存文件中的记录或者更新缓存文件
$file = 'sql_cache.txt';
$expire = 86400; // 24 小时 (单位:秒)
if (file_exists($file) &&
filemtime($file) > (time() - $expire))
{
// 取得缓存中的记录
$records = unserialize(file_get_contents($file));
} else {
// 通过 serialize() 函数创建缓存
}
附加其它可能的:
<!--[if !supportLists]-->l <!--[endif]-->把缓存结果存储在共享内存中以获取更快的速度
<!--[if !supportLists]-->l <!--[endif]-->增加一个功能随机地运行SQL查询并且检查是否输出与缓存输出一致。如果不一致,则更新缓存(本函数运行次数的概率可以定为1/100)。通过哈希算法(如MD5())可以协助判断字符串或者文件是否改变。
<!--[if !supportLists]-->l <!--[endif]-->增加一个管理员的功能,人工的删除这个缓存文件,以强制更新缓存(如file_exists()函数返回false时)。你可以用函数unlink()删除文件。





