Mar
11

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()删除文件。

共计 0 条评论

NAME:

required

E-MAIL:

required, will not be published

HOMEPAGE:

CONTENT: