\r\n
\r\n
\r\n
接下来我们开始探索更常用的缓存技术,这也是本文的重点部份。首先我们使用PEAR中的cache包。PEAR可以将内容缓存于文件,数据库或者内存中,我们以文件为例。
\r\n
下面是一个没有使用缓存的PHP小程序:
\r\n
\r\n
pear_content_cache1.php
\r\n
\r\n
<?php
echo \”这是内容。<P>\”;
echo \”当前时间是\” . date(\’M-d-Y H:i:s A\’, time()) . \”<BR>\”;
?>
\r\n
\r\n
上面这个程序非常简单,现在我们为其加上缓存。
\r\n
\r\n
pear_content_cache2.php
\r\n
\r\n
<?php
require_once \’Cache/Output.php\’;
//设置缓存目录,必须是可写的
$cacheDir = \’./pear_cache\’;
$cache = new Cache_Output(\’file\’,array(\’cache_dir\’ => $cacheDir));
//如果nocache变量为空,使用缓存中的内容
//如果想获得最新的内容,就要赋值给nocache变量
if (empty($_REQUEST[\'nocache\']))
{
// 建立一个独一的cache标识
// 请求+Cookie信息
$cache_id = $cache->generateID(array(\’url\’ => $_REQUEST,\’post\’ =>$_POST,\’cookies\’ => $HTTP_COOKIE_VARS));
}
else
{
//想获得最新的内容,ID为空
$cache_id = null;
}
//看cache ID对应的缓存内容是否可用
if ($content = $cache->start($cache_id))
{
//缓存已存在,直接输出,并结束脚本
echo $content;
exit();
}
// 缓存中不存在该内容,生成新内容并写入缓存
echo \”这是内容。<P>\”;
echo \”当前时间是\” . date(\’M-d-Y H:i:s A\’, time()) . \”<BR>\”;
// 把内容写入缓存
echo $cache->end();
?>
\r\n
\r\n
分别刷新这两个文件,你会发现pear_content_cache1.php中的“当前时间是”这一行中的时间是随着刷新而变化的,而pear_content_cache2.php中的这一行则不变。这是由于pear_content_cache2.php使用了缓存,将用户请求的内容存入静态文件中。当用户再次请求时,它直接从文件中输出,而不需要用程序动态生成内容。
\r\n
对于pear_content_cache2.php,如果用户想要读取最新的信息,而不是缓存中成旧的信息。那么可以用http://…/pear_content_cache2.php?nocache=1 来访问,这将禁用缓存功能。刷新一下看看,你将发现时间会随之变化。
\r\n
总结一下PEAR内容缓存类的使用:
\r\n
1.包含PEAR包 要注意设对路径。
\r\n
2.包含Output.php中的cache类
\r\n
require_once \’Cache/Output.php\’;
\r\n
3.设置缓存目录
\r\n
$cacheDir = \’./pear_cache\’;
\r\n
确认这个目录是可写的。Cache数据将会写入这个目录的子目录中。
\r\n
4.建立一个输出缓存对象
\r\n
$cache = new Cache_Output(\’file\’,array(\’cache_dir\’ => $cacheDir));
\r\n
第一个参数表示我们使用基于“文件”方式的缓存,第二个参数是一个与缓存目录相关联的数组。
\r\n
5.产生一个唯一的cache ID
\r\n
$cache_id = $cache->generateID(array(\’url\’ => $_REQUEST,\’post\’ =>$_POST,\’cookies\’ => $HTTP_COOKIE_VARS));
\r\n
这里$cache对象的generateID()方法通过提供一个信息数组(URL, HTTP POST data, 和 HTTP cookie)来独一无二地标识这个请求,与其它请求区分开来。
\r\n
6.增加一个逻辑判断语句看是否对应于cacheID的缓存数据是否已经存在,如果存在,获取数据并结束脚本。
\r\n
if ($content = $cache->start($cache_id))
{ echo $content;
exit();
}
\r\n
7. 将产生内容的代码放在以上逻辑语句之后,并结束使用cache对象。
\r\n
echo $cache->end();
\r\n
\r\n
\r\n
◆ 函数缓存输出 PEAR cache \r\n
PEAR除了可以对输出的内容进行缓存处理外,还可以将对某个函数的调用结果缓存起来。这是个很有趣的功能,如果你的程序要频繁使用到某个函数,而且调用的结果相同的话,我建议你不妨试试,特别是当这个函数运行起来比较慢的时候。 \r\n
下面我们实现对一个执行起来很慢的函数slowFunction()的缓冲调用。
\r\n
\r\n
<?php
require_once \’Cache/Function.php\’;
$cacheDir = \’./pear_cache/\’;
$cache = new Cache_Function(\’file\’,array(\’cache_dir\’ => $cacheDir));
$arr = array(\’苹果\’, \’梨\’,\’西瓜\’);
$cache->call(\’slowFunction\’, $arr);
echo \’<BR>\’;
$arr = array(\’苹果\’, \’梨\’,\’西瓜\’);
slowFunction($arr);
function slowFunction($arr = null)
{
echo \”一个执行起来很慢的函数
<br>\”;
echo \”当前时间是 \” . date(\’M-d-Y H:i:s A\’, time()) . \’<br>\’;
foreach ($arr as $fruit)
{
echo \”我吃了一个 $fruit <br>\”;
}
}
?> \r\n
\r\n
以下是示例的脚本执行结果:
\r\n
一个执行起来很慢的函数
当前时间是 Jul-28-2004 17:15:57 PM
我吃了一个 苹果
我吃了一个 梨
我吃了一个 西瓜
一个执行起来很慢的函数
当前时间是 Jul-28-2004 17:17:55 PM
我吃了一个 苹果
我吃了一个 梨
我吃了一个 西瓜
\r\n
代码中,Cache/Function.php类用来执行函数缓冲功能。$cache变量是一个Cache_Function对象,使用基于文件的函数缓存,存入$cacheDir目录。要缓存一个函数调,Cache_Function对象$cache的call()方法要像这样使用:$cache->call(‘slowFunction’, $arr);
\r\n
这里,slowFunction()函数被调用,参数为一个数组$arr,这个函数被缓存在$cacheDir目录下的一个文件里。任何在此之后的对这个函数的调用,将会由$cache->call()返回该函数执行的结果。
\r\n
函数缓存和使用方法和内容缓存很相似,不再多说,具体请查看PEAR手册。
\r\n
\r\n
\r\n
以上我们都是利用优化代码的方法对程序进行提速,接着我们要关注一下PHP加速的另一个领域—缓存工具软件。这类软件都是从优化PHP运行环境来提速的,不需要改变任何代码。我们可以大概地将它们称为“执行码优化/缓存工具”,你可以理解为它们用来实现比较底层的优化/缓存。
\r\n
\r\n
以下列出目前比较常用的此类工具,具体哪种效果最好,请用自己的服务器环境测试:
\r\n
(一)APC Alternative PHP Cache
\r\n
\r\n
APC运行于Linux和FreeBSD,你需要自己编译安装。按照其开发人员的说法,在他们的测试环境下可以提高脚本速度50%-400%。并且APC是个开源项目,已经加入了PHP的PECL库,很值得一试。
\r\n
\r\n
Turck MMCache似乎是此类软件中目前最受欢迎的一种,它开放源代码,完全免费。它将PHP代码预编译并缓存起来,同时也对PHP运行环境进行一定优化。按照其官方文档的说法,MMCache可以明显地减轻服务器的负载,并提高脚本执行速度1-10倍。
\r\n
MMCache与另一个知名的加速软件Zend Optimizer兼容,但注意必需先安装MMCache(php.ini中设置)。除了加快PHP程序的速度,MMCache还可以将PHP代码加密。
\r\n
Turck MMCache同时支持Linux和Win32平台。
\r\n
(三)PHPA the PHP Accelerator
\r\n
\r\n
PHPA又是另一个流行的PHP加速软件。在其官方网站上有分别使用PHPA与APC、Zend Cache的PHP脚本执行测试对比,其表现略优于APC,略逊于Zend Cache。
\r\n
PHPA支持Linux, FreeBSD, OpenBSD, BSDi和Solaris系统.
\r\n
(四)Zend Performance Suite
\r\n
\r\n
Zend Performance Suite是老牌的PHP加速/优化软件,依托于PHP领域最知名的Zend公司。目前已经推出4.0版本,它可以为PHP应用提供程序加速,内容缓存,文件压缩,下载服务等,功能十分强大,获得好几个PHP杂志的推荐奖—但是不得不提起,它也很昂贵,目前的价格是1875美元。
\r\n
以上几种加速软件,希望读者按照服务器环境自行测试并选择其中最适用的,因为我没有办法提供一个普遍适用的测试标准来判断哪种方案是最有效的。综合起来看,我个人认为Turck MMCache是个值得推荐的选择,免费而且功能相当出色。
\r\n
\r\n
\r\n
\r\n
以上从多个角度较为全面细致地阐述了PHP加速的相关技术,包括测试技术,加速技术(压缩,缓存等),基本上都有附代码和范例。希望本文有助于读者全面了解PHP程序加速并在实际应用中选择合适的加速方案。