内容缓存输出 PEAR cache
接下来我们开始探索更常用的缓存技术这也是本文的重点部份首先我们使用PEAR中的cache包PEAR可以将内容缓存于文件数据库或者内存中我们以文件为例
下面是一个没有使用缓存的PHP小程序
pear_content_cachephp
<?php
echo "这是内容<P>";
echo "当前时间是" date(MdY H:i:s A time()) "<BR>";
?>
上面这个程序非常简单现在我们为其加上缓存
pear_content_cachephp
<?php
require_once Cache/Outputphp;
//设置缓存目录必须是可写的
$cacheDir = /pear_cache;
$cache = new Cache_Output(filearray(cache_dir => $cacheDir));
//如果nocache变量为空使用缓存中的内容
//如果想获得最新的内容就要赋值给nocache变量
if (empty($_REQUEST[nocache]))
{
// 建立一个独一的cache标识
// 请求+Cookie信息
$cache_id = $cache>generateID(array(url => $_REQUESTpost =>$_POSTcookies => $HTTP_COOKIE_VARS));
}
else
{
//想获得最新的内容ID为空
$cache_id = null;
}
//看cache ID对应的缓存内容是否可用
if ($content = $cache>start($cache_id))
{
//缓存已存在直接输出并结束脚本
echo $content;
exit();
}
// 缓存中不存在该内容生成新内容并写入缓存
echo "这是内容<P>";
echo "当前时间是" date(MdY H:i:s A time()) "<BR>";
// 把内容写入缓存
echo $cache>end();
?>
分别刷新这两个文件你会发现pear_content_cachephp中的“当前时间是”这一行中的时间是随着刷新而变化的而pear_content_cachephp中的这一行则不变这是由于pear_content_cachephp使用了缓存将用户请求的内容存入静态文件中当用户再次请求时它直接从文件中输出而不需要用程序动态生成内容
对于pear_content_cachephp如果用户想要读取最新的信息而不是缓存中成旧的信息那么可以用http://…/pear_content_cachephp?nocache=来访问这将禁用缓存功能刷新一下看看你将发现时间会随之变化
总结一下PEAR内容缓存类的使用
.包含PEAR包 要注意设对路径
.包含Outputphp中的cache类
require_once Cache/Outputphp;
.设置缓存目录
$cacheDir = /pear_cache;
确认这个目录是可写的Cache数据将会写入这个目录的子目录中
.建立一个输出缓存对象
$cache = new Cache_Output(filearray(cache_dir => $cacheDir));
第一个参数表示我们使用基于“文件”方式的缓存第二个参数是一个与缓存目录相关联的数组
.产生一个唯一的cache ID
$cache_id = $cache>generateID(array(url => $_REQUESTpost =>$_POSTcookies => $HTTP_COOKIE_VARS));
这里$cache对象的generateID()方法通过提供一个信息数组(URL HTTP POST data 和 HTTP cookie)来独一无二地标识这个请求与其它请求区分开来
.增加一个逻辑判断语句看是否对应于cacheID的缓存数据是否已经存在如果存在获取数据并结束脚本
if ($content = $cache>start($cache_id))
{
echo $content;
exit();
}
将产生内容的代码放在以上逻辑语句之后并结束使用cache对象
echo $cache>end();
函数缓存输出 PEAR cache
PEAR除了可以对输出的内容进行缓存处理外还可以将对某个函数的调用结果缓存起来这是个很有趣的功能如果你的程序要频繁使用到某个函数而且调用的结果相同的话我建议你不妨试试特别是当这个函数运行起来比较慢的时候
下面我们实现对一个执行起来很慢的函数slowFunction()的缓沖调用
<?php
require_once Cache/Functionphp;
$cacheDir = /pear_cache/;
$cache = new Cache_Function(filearray(cache_dir => $cacheDir));
$arr = array(苹果 梨西瓜);
$cache>call(slowFunction $arr);
echo <BR>;
$arr = array(苹果 梨西瓜);
slowFunction($arr);
function slowFunction($arr = null)
{
echo "一个执行起来很慢的函数 :( <br>";
echo "当前时间是 " date(MdY H:i:s A time()) <br>;
foreach ($arr as $fruit)
{
echo "我吃了一个 $fruit <br>";
}
)
?>
以下是示例的脚本执行结果
一个执行起来很慢的函数
当前时间是 Jul :: PM
我吃了一个 苹果
我吃了一个 梨
我吃了一个 西瓜
一个执行起来很慢的函数 :(
当前时间是 Jul :: PM
我吃了一个 苹果
我吃了一个 梨
我吃了一个 西瓜
代码中Cache/Functionphp类用来执行函数缓沖功能$cache变量是一个Cache_Function对象使用基于文件的函数缓存存入$cacheDir目录要缓存一个函数调Cache_Function对象$cache的call()方法要像这样使用$cache>call(‘slowFunction’ $arr);
这里slowFunction()函数被调用参数为一个数组$arr这个函数被缓存在$cacheDir目录下的一个文件里任何在此之后的对这个函数的调用将会由$cache>call()返回该函数执行的结果 函数缓存和使用方法和内容缓存很相似不再多说具体请查看PEAR手册