采用 PEAR 来缓冲 PHP 程序 YwGHG{?e
IJ0#iA. T
PHP 世界中缓冲是一个热门的话题,因为 PHP 产生的动态页面,每次用户请求都需要重新计算,不论请求的结果是否一样,同时,PHP 每次都会编译一次脚本。这样的超负荷运转对一个流量很高的网站来说肯定难以忍受。幸运的是, Web 的结果可以缓冲,而不需要重新运行和编译脚本,商品化的产品像 ZendCache 或者开源的 Alternate PHP Cache都提供了把 PHP 脚本编译为字节代码并缓冲的办法。 7RD$=?o O'
#K|0laul
PEAR 的缓冲包提供了缓冲动态内容,数据库查询和 PHP 函数调用的框架。 \04mLIJr9
|gW
就像 Perl 有 CPAN, TeX 有 CTAN,PHP 也有自己的中心资源库,存放类,库和模块。这个库称为 PEAR(PHP Extension and Add-On Repository)。 Qo.Uqz.C
DKTD Z*
本文假设你已经安装了 PEAR 环境,如果没有的话,可以去 PHP 网站下载。 %MbyKz:X
t-!m
vx9Z
{M[~E|@D
PEAR 的缓冲包包含一个总体的缓冲类和几个特别的子类。缓冲类使用容器类来存贮和管理缓冲数据。 ^Z#@3=
:&9TW]*g
下面是 PEAR 缓冲当前所包含的容器,以及各自的参数: wYjQV?,
~H u"yAR
file -- file 容器在文件系统存储了缓冲的数据,是最快的容器。 f|#8qiUS
&Xv1[nByU
cache_dir -- 这是容器存储文件的目录。 ]rnXNn;
{\EOo-&A
filename_prefix -- 缓冲文件的前缀,例如:"cache_"。
J,(7.+`~#
0aogBg_@K
shm -- shm 容器把缓冲数据放入共享内存,基准测试显示,目前的实现下,这个容器的速度要比文件容器慢。 3 "Yif
0yz~W(tsm
shm_key -- 共享内存使用的键值。 BRa{\R^I
/=TH08
shm_perm -- 使用共享内存数据段的权限。 XMw.wQ'?
'#W_boN
shm_size -- 分配共享内存的大小。 W^k,Pmopy
iV!@bC,
sem_key -- 信号灯的键值。 vr 4O8#
;%WdvnW
sem_perm -- 信号灯的权限。 N
xFUO0O3
) "[HZ/
db -- PEAR 的数据库抽象层。 [zQWyDu
T9?54r
dsn -- 数据库连接的 DSN 。可以参考 PEAR 的 DB 文档。 3 z=\.R
=JW[pRI5a
cache_table -- 表的名字。 AWT"Y4Ie
&{ ZSE^
phplib -- phplib 容器使用数据库抽象层存储缓冲。 4jGLAor|
B)6#Lp3
db_class t.)AggXj#
3fp> 4;ym'
db_file qp&4 1
y(}Eko4u5
db_path \2>?6zs
_=EZ `!%
local_file h>klTPM>
@VK6JjIq
local_path VoM6
/c#l9&,
ext/dbx -- PHP 的数据库抽象层扩展,如果像把缓冲存入数据库,可以采用这个容器。 ! Mo`^t
. :a<2sp6
module TBnvV 5_
K&dT(U
host DW|vMpU]u
$P nLG]X
db 2+:'0Krc
,{8v4b-
username ne*#+Q{E
#wjH4DT
password YE\K<T
jH
'$[Di'*;
cache_table 41yOXy ;~l
0x ~`5h
persistent ^A!$i$NON
`WnQ
使用 PEAR Cache 所得到的性能提升取决于你所选择的缓冲容器,例如,把数据库的结果再次存入数据库缓冲中就显得毫无意义。 smup,RNZRX
cDeZMsV
PEAR Cache 的函数缓冲模块能把任何函数或者方法的结果缓冲,不论是 PHP 的内置函数还是用户自定义函数,他缺省采用文件容器,把缓冲数据放入到一个叫做 utH%y\NMF|
function_cache 的目录。 ,E}$[mHyjz
0
iRR{a<
"hPCQp`Tj
Cache_Function 类的构造器可以有三个可选的参数: 6/1$<!WH
ehT%s+aUw
$container :缓冲容器的名字。 7ZsA5%s=,
-DCa
$container_options :缓冲容器的数组参数。 4pPI'd&/7
e_rzA
$expires:缓冲对象过期的时间(秒数)。 !ni>\lZ
]JMl|e
普通的函数调用采用 Cache_Function 类的 call() 方法时,就能触发缓冲。调用 call() 很容易,的一个参数是函数的名字,然后是函数的参数,第二个参数是要调用函数中的第一个,依此类推,我们来看例子: Qn|+eLY
Js{=i>D
例 1: 缓冲函数和方法的调用 HnU Et/
,@.EpbB
// 调用 PEAR Cache 的函数缓冲。 V LdB_r3lQ
IzUo0D*@
<?php af'@h:
require_once 'Cache/Function.php'; *aRX \TnN
<
kP+eD
// 定义一些类和函数。 d#>y }H9
&z@~B&O
class foo { nIBFk?)6
function bar($test) { >qh?L#Fk
echo "foo::bar($test)<br>"; ]tY:,Mfs
} Cv^`&\[SW+
} A,#2 ^dR
!9 f4R/ ?
class bar { _~M^ uW^l
function foobar($object) { +S9PML){h
echo '$'.$object.'->foobar('.$object.') o@k84+tn(
'; A5nO=
} wa:0X)KC?
} 4l @)K9F
AIZBo@xg
$bar = new bar;
'Cc(3
d8OL!Rk
function foobar() { LM"y\q ]
echo 'foobar()'; _^\$"nw
} ][7p+IsB
XUmR{A
// 取得 Cache_Function 对象 v(O=IUa
lddp^ #f
$cache = new Cache_Function(); cdTsRS;E
|B^G:7c
// 对 foo 类的静态函数 bar() 作缓冲(foo::bar())。 Vmi{X b]<
$cache->call('foo::bar', 'test'); ~uj;qq
YRcps0Dx9
// $bar->foobar() z$[C#5+2
$cache->call('bar->foobar', 'bar'); >oJkJ$|wU
TH?9< C-C
$cache->call('foobar'); `i fiL
?> ao$.6X8fQ
FWY2s(5p
IIz0m3';+
9[Qd)%MO
下面我们采用 Cache_Output 来把输出作缓冲: \#,t O%D
50~K,Jx6B
例子 2: 缓冲脚本的输出 ^gYD*K!*
g^~Kze
// 加载 PEAR Cache 的输出缓冲 gEJi[E@
&`!^Zq vG
<?php aGoE,5
require_once 'Cache/Output.php'; [j9E pi(
0KvVw rWJ
$cache = new Cache_Output('file', array('cache_dir' => '.') ); 51xk>_Hm}|
#T3h}=
// 计算要缓冲页面的标记,我们假定页面的缓冲取决于 d,cN(
// URL, HTTP GET 和 POST 变量以及 cookies。 '&yeQ
jbmTmh1q
$cache_id = $cache->generateID(array('url' => $REQUEST_URI, 'post' => $HTTP_POST_VARS, 'cookies' => $HTTP_COOKIE_VARS) ); <@uOCRbV
la^
DjHA$
// 查询缓冲 vkcRm`.
#A<P6zJXR
if ($content = $cache->start($cache_id)) { 0q6I;$H
Ee2c5C!|C
// 缓冲命中 B'weok
echo $content; v:|(8Y
die(); q/gB<p9
} G/?~\
}:s
<{J5W6
// 缓冲丢失 >e&