采用 PEAR 来缓冲 PHP 程序 's$/-AV
j:U6q,f]
PHP 世界中缓冲是一个热门的话题,因为 PHP 产生的动态页面,每次用户请求都需要重新计算,不论请求的结果是否一样,同时,PHP 每次都会编译一次脚本。这样的超负荷运转对一个流量很高的网站来说肯定难以忍受。幸运的是, Web 的结果可以缓冲,而不需要重新运行和编译脚本,商品化的产品像 ZendCache 或者开源的 Alternate PHP Cache都提供了把 PHP 脚本编译为字节代码并缓冲的办法。 jXIVR'n(
{
T?1v*.[
PEAR 的缓冲包提供了缓冲动态内容,数据库查询和 PHP 函数调用的框架。 8zQN[[#n
o@ @| 4
F
就像 Perl 有 CPAN, TeX 有 CTAN,PHP 也有自己的中心资源库,存放类,库和模块。这个库称为 PEAR(PHP Extension and Add-On Repository)。
^M+aQg%
gdS@NUM
本文假设你已经安装了 PEAR 环境,如果没有的话,可以去 PHP 网站下载。 XRi37|p
) .W0}
Y^eF(
PEAR 的缓冲包包含一个总体的缓冲类和几个特别的子类。缓冲类使用容器类来存贮和管理缓冲数据。 y<PQ$D)
[= Xb*~
下面是 PEAR 缓冲当前所包含的容器,以及各自的参数: lD$\t/8B
eE@7AM
file -- file 容器在文件系统存储了缓冲的数据,是最快的容器。
%$=2tfR
_z>%h>L|g
cache_dir -- 这是容器存储文件的目录。 )gV @6w
?L6wky{
filename_prefix -- 缓冲文件的前缀,例如:"cache_"。 7h`t-6<!q
Xt!wOW
shm -- shm 容器把缓冲数据放入共享内存,基准测试显示,目前的实现下,这个容器的速度要比文件容器慢。 `o21f{1]X&
nGxG!
shm_key -- 共享内存使用的键值。 T$Z}1e]
G)&!f)6
shm_perm -- 使用共享内存数据段的权限。 _po5j;"_O
rLA^ &P:
shm_size -- 分配共享内存的大小。 3e1%G#fu
s` =&l
sem_key -- 信号灯的键值。 Zi<(>@z2
e^UUR-K%
sem_perm -- 信号灯的权限。 a0's6C
# ELYPp]6
db -- PEAR 的数据库抽象层。 lXXWQ=
9Dd`x7$a
dsn -- 数据库连接的 DSN 。可以参考 PEAR 的 DB 文档。 S 9;FD 3
wpt5'|I
cache_table -- 表的名字。 : :928y
izLB4pk$
phplib -- phplib 容器使用数据库抽象层存储缓冲。 MHS|gR.c
;A0ZcgF
db_class Z8Tb43?
?(M]'ia{
db_file 7A{Z1[7
3?TUt{3g
db_path NRI[|
+ZkJ{r0,(
local_file Nhtc^DX
6t gq.XL^n
local_path a!.Y@o5Ku
k=X)axt1
ext/dbx -- PHP 的数据库抽象层扩展,如果像把缓冲存入数据库,可以采用这个容器。 q[x|tO
*r ('A
module XII',&
rd,!-w5
host )"%J~:`h}
1";s#Jq
db <kazV<"
xPJ@!ks9
username 10_>EY`
>AWWwq -
password 'tt4"z2
\b#`Ahf`
cache_table wdIJ?\/763
dwb ^z+
persistent tO3#kV\,
IV%Rph>d
使用 PEAR Cache 所得到的性能提升取决于你所选择的缓冲容器,例如,把数据库的结果再次存入数据库缓冲中就显得毫无意义。 z }Vg4\x&
0|,Ij$
PEAR Cache 的函数缓冲模块能把任何函数或者方法的结果缓冲,不论是 PHP 的内置函数还是用户自定义函数,他缺省采用文件容器,把缓冲数据放入到一个叫做 67U6`9d
function_cache 的目录。 &&C'\,ZK5
[S0wwWU |0
P.djR)YI
Cache_Function 类的构造器可以有三个可选的参数: JO~62='J
azG"Mt|7Z
$container :缓冲容器的名字。 J^zB5W,)
6UU<:KH
$container_options :缓冲容器的数组参数。 QFFFxaeJg
xrkR)~ E
$expires:缓冲对象过期的时间(秒数)。 !1l~'/r
<:!:7
普通的函数调用采用 Cache_Function 类的 call() 方法时,就能触发缓冲。调用 call() 很容易,的一个参数是函数的名字,然后是函数的参数,第二个参数是要调用函数中的第一个,依此类推,我们来看例子: .&n!4F'
9[[$5t`8
例 1: 缓冲函数和方法的调用 /$9We8
#P
{|7}jk
// 调用 PEAR Cache 的函数缓冲。
)!FheoR
*]c~[&x5&
<?php (~fv;}}v
require_once 'Cache/Function.php'; o* e'D7
pDcGf7
// 定义一些类和函数。 t(}g;O-
'f8'|o)
class foo { NTVaz.
function bar($test) { GE=PaYz
echo "foo::bar($test)<br>"; >[Tt'.S!?
} RL*b47,
} wM}AWmH
Kd*=-
class bar { nuw7pEW@?
function foobar($object) { z6|kEc"{
echo '$'.$object.'->foobar('.$object.') z&\N^tBv
'; Y/
%XkDC~
} TY?O$d2b3
} #$l:%
JW"n#sR4
$bar = new bar; |O;vWn'U2
\uZ1Sl
function foobar() { Uy@:-NC)kn
echo 'foobar()'; fh`}~ aQ
} IuMJ-"
&w:0ad|
// 取得 Cache_Function 对象 f/"IC;<~t>
# hw;aQ
$cache = new Cache_Function(); yE;S6 O
COj^pdE3
// 对 foo 类的静态函数 bar() 作缓冲(foo::bar())。 V7D<'!
$cache->call('foo::bar', 'test'); ):fu]s"
'Z)#Sz Y
// $bar->foobar() @.,'A[D!K
$cache->call('bar->foobar', 'bar'); `/<f([w
8t|?b
$cache->call('foobar'); ! vuun |
?> 6XnUs1O
o\fPZ`p-m~
#}Bv/`t
;@O8y\@
下面我们采用 Cache_Output 来把输出作缓冲: Ml/K~H
tN
r4 qs!(
例子 2: 缓冲脚本的输出 Z_>:p^id
->Fsmb+R
// 加载 PEAR Cache 的输出缓冲 U&SSc@of
9t8ccr
<?php tH:?aP*2
require_once 'Cache/Output.php'; -![{Zb@
V0n8fez
b
$cache = new Cache_Output('file', array('cache_dir' => '.') );
$QwzL/a
O2xqNQ`d
// 计算要缓冲页面的标记,我们假定页面的缓冲取决于 r]Lj@0F>8
// URL, HTTP GET 和 POST 变量以及 cookies。 Oq(FV[N7t
cQ3p|a `
$cache_id = $cache->generateID(array('url' => $REQUEST_URI, 'post' => $HTTP_POST_VARS, 'cookies' => $HTTP_COOKIE_VARS) ); 0^6}s1d_
<SdOb#2
// 查询缓冲 ygd*zy9
O9RnS\
if ($content = $cache->start($cache_id)) { Z%
]LZ/O8
w^:@g~
// 缓冲命中 5i'KGL
echo $content; "2 D{X
die(); h;mOfF
} '-#gQxIpD
*z]P|_:&G
// 缓冲丢失 @6-3D/=
@KJmNM1]V
// -- 在这里插入内容产生代码 --
&a6-+r
X5= Ki
$+
// 把页面存入缓冲 [C!m,4
echo $cache->end(); X?] Mzcu
?>
"#pN
^ '_Fd
利用 Cache_Output 类,很容易把一个动态的数据库驱动的网站应用转化为静态,从而极大的提升站点的性能。 ?P}) Qa
X>Z83qV5d!
越来越多的站点在采用 GZIP 压缩 HTML 内容,这样减少了服务器的带宽消耗,对于使用 Modem 上网的用户来说也能受益不少。 IvI;Q0E-3
u3DFgl3-7
Cache_OutputCompression 扩展了 Cache_Output 类的功能,他把 GZIP 压缩的 HTML 内容进行缓冲,从而节省了 CPU 压缩的时间。