采用 PEAR 来缓冲 PHP 程序 .X3n9]
#akJhy@m$
PHP 世界中缓冲是一个热门的话题,因为 PHP 产生的动态页面,每次用户请求都需要重新计算,不论请求的结果是否一样,同时,PHP 每次都会编译一次脚本。这样的超负荷运转对一个流量很高的网站来说肯定难以忍受。幸运的是, Web 的结果可以缓冲,而不需要重新运行和编译脚本,商品化的产品像 ZendCache 或者开源的 Alternate PHP Cache都提供了把 PHP 脚本编译为字节代码并缓冲的办法。 e+!xy&u@u
`=pA;R9
PEAR 的缓冲包提供了缓冲动态内容,数据库查询和 PHP 函数调用的框架。 j.6!T'$|
r&xIVFPI[
就像 Perl 有 CPAN, TeX 有 CTAN,PHP 也有自己的中心资源库,存放类,库和模块。这个库称为 PEAR(PHP Extension and Add-On Repository)。 x7e0&
Dn<3#V
本文假设你已经安装了 PEAR 环境,如果没有的话,可以去 PHP 网站下载。 4 ;_g9]
H HX q_-V
tYTl-c
PEAR 的缓冲包包含一个总体的缓冲类和几个特别的子类。缓冲类使用容器类来存贮和管理缓冲数据。 H.iCYD_=
f{2UL ?y
下面是 PEAR 缓冲当前所包含的容器,以及各自的参数: #QsJr_=
>!Y#2]@}o
file -- file 容器在文件系统存储了缓冲的数据,是最快的容器。 x(sKkm`Q
7_3
PM
3C
cache_dir -- 这是容器存储文件的目录。 6?5dGYAX<
(D[~Z!
filename_prefix -- 缓冲文件的前缀,例如:"cache_"。 8h)7K/!\
9[\do@
shm -- shm 容器把缓冲数据放入共享内存,基准测试显示,目前的实现下,这个容器的速度要比文件容器慢。 I/upiq y
Ie!">8."
shm_key -- 共享内存使用的键值。 v B~VJKD
0?t;3z$n
shm_perm -- 使用共享内存数据段的权限。 P=}dR&gk'
:Nf(:D8
shm_size -- 分配共享内存的大小。 z7BFkZ6+
^& *;]S`
sem_key -- 信号灯的键值。 O0r vr$.
QsPg4y3?D
sem_perm -- 信号灯的权限。 -4Dz98du
/C'_-U?
db -- PEAR 的数据库抽象层。 }vx
4 6
c1i[1x%
dsn -- 数据库连接的 DSN 。可以参考 PEAR 的 DB 文档。 s^6,"C
4VvE(f
cache_table -- 表的名字。 2h<_?GM\s
Ui"$A/
phplib -- phplib 容器使用数据库抽象层存储缓冲。 WoNJF6=?
HLthVc w
db_class 90F.9rh
<2kv/
db_file r91i :
gkTwGI+w
db_path pHoxw|'Y
&)Zv>P8z`
local_file s!D?%
UWqiA`,
local_path OhaoLmA}6
wNl6a9#
ext/dbx -- PHP 的数据库抽象层扩展,如果像把缓冲存入数据库,可以采用这个容器。 i&m6;>?`
3qu?qD
module Je"XIhBr
c>c4IQ&d
host yXtQfR
bs%
RWwn
db Iq19IbR8
WSU/Z[\`H
username 1PWi~1q{Q
qKeR}&b
password XmVst*2=
cw0@Z0
cache_table J.g6<n
xrNe:Aj
persistent Xfb-<
Q0A
2Z"\%ZD
使用 PEAR Cache 所得到的性能提升取决于你所选择的缓冲容器,例如,把数据库的结果再次存入数据库缓冲中就显得毫无意义。 N`X|z
^xgPL'
PEAR Cache 的函数缓冲模块能把任何函数或者方法的结果缓冲,不论是 PHP 的内置函数还是用户自定义函数,他缺省采用文件容器,把缓冲数据放入到一个叫做 ~EQ#
%db
function_cache 的目录。 \ ux{J
XMI5j7CL
KdTWi;mV2-
Cache_Function 类的构造器可以有三个可选的参数: ]H`pM9rC
qM
Qu!%o
$container :缓冲容器的名字。 0Nk!.gY
J5f}-W@
$container_options :缓冲容器的数组参数。 0;w 4WJJ
hDoFF8)c
$expires:缓冲对象过期的时间(秒数)。 L"T :#>
DbR!s1ux
普通的函数调用采用 Cache_Function 类的 call() 方法时,就能触发缓冲。调用 call() 很容易,的一个参数是函数的名字,然后是函数的参数,第二个参数是要调用函数中的第一个,依此类推,我们来看例子: I&^hG\D
X*Q<REDB
例 1: 缓冲函数和方法的调用 @L607[!?
%l%2 hvGZ
// 调用 PEAR Cache 的函数缓冲。 , a2=OV
.M[t5I'\
<?php jQfnc:'
require_once 'Cache/Function.php'; 80gOh:
>B$ IrM7J
// 定义一些类和函数。 'w/S6j
-\Z`+k Y?p
class foo { AOqL&z
function bar($test) { Lo)T
echo "foo::bar($test)<br>"; tC=K;zsXpz
} k
$# ,^)T
} ?ZhBS3L
NUtKT~V
class bar { 8|!"CQJ|H
function foobar($object) { XZTH[#MqeI
echo '$'.$object.'->foobar('.$object.') Oo~
'; 9D?JzTsyg
} Cs vwc%
} :pvVm>
,a0RI<D
$bar = new bar; Io/;+R.
#,"[sag
function foobar() { 4~vn%O6n
echo 'foobar()'; 2c*}1
_
} $P #KL//
+
:b"0pu-H
// 取得 Cache_Function 对象 3]&le[.
jS#YqVuN
$cache = new Cache_Function(); x_(K%0+Ca
,s,AkH
// 对 foo 类的静态函数 bar() 作缓冲(foo::bar())。 i\K88B&24
$cache->call('foo::bar', 'test'); +.u
HY`A
A`I1G9s
// $bar->foobar() (3j f_
$cache->call('bar->foobar', 'bar'); &}_tALg
O4^' H}*
$cache->call('foobar'); ?uF3Q)rCk
?> !H9zd\wc
DKNcp8<J
rF/<}ye/4M
9SU/86|N
下面我们采用 Cache_Output 来把输出作缓冲: ~UwqQD1p
- C8VDjf9
例子 2: 缓冲脚本的输出 "2"2qZ*h}
w)>/fG|;
// 加载 PEAR Cache 的输出缓冲 uPb. uG
Zo Ra^o
<?php k+eeVy
require_once 'Cache/Output.php'; zpcO7AY~
/~/nhKm
$cache = new Cache_Output('file', array('cache_dir' => '.') ); {C%f~j
T4;gF6(0]
// 计算要缓冲页面的标记,我们假定页面的缓冲取决于 U6YQ*%mZ_
// URL, HTTP GET 和 POST 变量以及 cookies。 w6AG:u
(w%9?y4Q
$cache_id = $cache->generateID(array('url' => $REQUEST_URI, 'post' => $HTTP_POST_VARS, 'cookies' => $HTTP_COOKIE_VARS) ); LiEDTXRz
CI|#,^
// 查询缓冲 aM\Ph&c7e'
5^N`~
if ($content = $cache->start($cache_id)) { -]:1zU
l~x
6R~q
// 缓冲命中 EB
p(^rj
echo $content; lQVK~8t3
die(); kM76?M
} ii ^Nxnc=
wf~n>e^e
// 缓冲丢失 58PL@H~@0
Co:Rg@i(F
// -- 在这里插入内容产生代码 -- uAV-wc
'.XR,\g>
// 把页面存入缓冲 9#\oGzDN
echo $cache->end(); #ahe@|E'Y
?> M{X; H'2
w(q\75
利用 Cache_Output 类,很容易把一个动态的数据库驱动的网站应用转化为静态,从而极大的提升站点的性能。 6I\4Yv$N
odTIz{9qG
越来越多的站点在采用 GZIP 压缩 HTML 内容,这样减少了服务器的带宽消耗,对于使用 Modem 上网的用户来说也能受益不少。 B~u`bn,iQ
r@G34QC+
Cache_OutputCompression 扩展了 Cache_Output 类的功能,他把 GZIP 压缩的 HTML 内容进行缓冲,从而节省了 CPU 压缩的时间。