php 缓存技术

一、引论

PHP, 一门最近几年兴起的web设计脚本语言,由于它的强大和可伸缩性,近几年来得到长足的发展,php相比传统的asp网站,在速度上有绝对的优势,想 mssql转6万条数据php如需要40秒,asp不下2分钟.但是,由于网站的数据越来越多,我们渴求能更快速的调用数据,不必要每次都从数据库掉,我 们可以从其他的地方,比方一个文件,或者某个内存地址,这就是php的缓存技术,也就是Cache技术.

二、分析深入

一般来说,缓存的目的是把数据放在一个地方让访问的更快点,毫无疑问,内存是最快的,但是,几百M的数据能往内存放么?这不现实,当然,有的时候临 时放如服务器缓存,如ob_start()这个缓存页面开启的话在发送文件头之前页面内容都被缓存在内存中,知道等页面输出自动清楚或者等待 ob_get_contents的返回,或者被ob_end_clean显示的清除,这在静态页面的生成中能很好的利用,在模板中能得到很好的体现,我的 这篇文章深入的讨论了:谈PHP生成静态页面,这是一种方式,但这是临时性的,不是解决我们问题的好方法.

另外,在asp中有一对象application,可以保存公用的参数,这也算点缓存,但在php,我至今没看到开发者产出这种对象,的确,没必要.asp.net的页面缓存技术就用的是viewstate,而cache就是文件关联,(不一定准确),文件被修改,更新缓存,文件没被修改而且不超时(注释1),就读取缓存,返回结果,就是这个思路,看看这个源码:

<?php
!l@7i b+R31957
8s$o2[Y4])d)t9m31957class cache{PHPChina 开源社区门户fg O&o'be9F/]
PHPChina 开源社区门户(G3d|)T T+F[s+wIO
/*PHPChina 开源社区门户 IJ$/g(q$o+}y1Q.V:]
PHPChina 开源社区门户*lPI*Nrv
Class Name: cachePHPChina 开源社区门户IG3}LVr G vD2a
PHPChina 开源社区门户F/p)U(^sG8r5f_
Descrīption: control to cache data,$cache_out_time is a array to save cache date time out.
k Kv;A5j5H1E u"J31957PHPChina 开源社区门户pwk+J3om
Version: 1.0PHPChina 开源社区门户!d2X.S1~ IR5a9H

h_6L.Ra*R31957Author: 老农 cjjerPHPChina 开源社区门户jdH2^&UUk p%M
PHPChina 开源社区门户gz+V�_;[cEwo)Or
Last modify:2006-2-26PHPChina 开源社区门户 ]-iGc/K4rC
PHPChina 开源社区门户b,nL S1XY!H
Author URL: http://www.cjjer.com
$rNO8J Tq7cf31957PHPChina 开源社区门户?g]f9r0m`
*/PHPChina 开源社区门户1Ka X-ij p6O$Ke
PHPChina 开源社区门户['ddC5_"] w+Tt]
private $cache_dir;PHPChina 开源社区门户Xl9Jn l_

^k2PeUk31957private $expireTime=180;//缓存的时间是 60 秒PHPChina 开源社区门户a/aiI8F A,q^

{2U0~#j!z/Q}RFrY V-/31957function __construct($cache_dirname){
-_A&j&q4_9`h31957PHPChina 开源社区门户�D)?3X#B5IAE`
if(!@is_dir($cache_dirname)){PHPChina 开源社区门户v(i�Q!tH}#]
PHPChina 开源社区门户7K*j/FK.H
if(!@mkdir($cache_dirname,0777)){PHPChina 开源社区门户_h [V_-?LAZ
PHPChina 开源社区门户`6h7[ZMo:{
$this->warn('缓存文件不存在而且不能创建,需要手动创建.');
DU3Ybw(E;/2^31957
Z}3EC-M)ts/!|31957return false;PHPChina 开源社区门户7@?gvx#lzG

kb3KF2D.q31957}
zj/M(x!k31957
+^rS*~4K /31957}
}0FY*Z,Q31957PHPChina 开源社区门户SO(Xfi3q!z
$this->cache_dir = $cache_dirname;
_dek${-M2| g3?P {q31957PHPChina 开源社区门户Y9Rz.A B
}PHPChina 开源社区门户0Pb"nz}8@;B

7]#F�f'dC9@dS6wX31957function __destruct(){PHPChina 开源社区门户_7d+K'|,Uj6W:r
PHPChina 开源社区门户/C#Xg4zJEj
echo 'Cache class bye.';
b2n)B2I#XL31957
a9YE,qa'QE,E d"}31957}

function get_url() {PHPChina 开源社区门户g~2RJB�Z

H%Pw ztym31957if (!isset($_SERVER['REQUEST_URI'])) {PHPChina 开源社区门户4~ZC+v6y'x7T

5_+Ge6PG'a31957$url = $_SERVER['REQUEST_URI'];
/O6[T p e L#L,e31957
M.h(J R*DJ Gm31957}else{
l:yoh6E9zx%qs,G*g.v31957PHPChina 开源社区门户 oV*Re'r)/2YK
$url = $_SERVER['scrīpt_NAME'];PHPChina 开源社区门户$l1s$F+C[ np0H9b

8r q]V!X+L9U M^u8X31957$url .= (!empty($_SERVER['QUERY_STRING'])) ? '?' . $_SERVER['QUERY_STRING'] : '';
8P}{G3~Q7S31957PHPChina 开源社区门户T7k KJc/A7`!Y7s
}

return $url;PHPChina 开源社区门户S5G%T)m cx _
PHPChina 开源社区门户!lH4b exnUcf
}

function warn($errorstring){
f/Tn-LGO8{!r31957
{5v8_�Ia)b31957echo "<b><font color='red'>发生错误:<pre>".$errorstring."</pre></font></b>";
8] N1L^|31957
,C#j3y%RG)^]�tS31957}

function cache_page($pageurl,$pagedata){PHPChina 开源社区门户7H+cC^%b}ar

'oW!pL/S]31957if(!$fso=fopen($pageurl,'w')){
1R5OT}(K2s31957PHPChina 开源社区门户]2vLr*Y
$this->warns('无法打开缓存文件.');//trigger_errorPHPChina 开源社区门户"`#{rQ,n%kD
PHPChina 开源社区门户5BN)D6^-j5G8L[s:C
return false;PHPChina 开源社区门户k&@2[*Y+UF

?c!ak%_z:/5yHeL31957}PHPChina 开源社区门户-LsaD2b:N

,T5u�k6Zbj%B{31957if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定
z0@;_t;C@'rT(P c(?i31957PHPChina 开源社区门户�]6x.d2]Z3K'ar6~Br4~
$this->warns('无法锁定缓存文件.');//trigger_error
'T EX |�s]TX31957
2oLYBR4V ~#Ah#t@ h31957return false;
L Eg;d Fw31957
+FLca)ie/Y(w?/Y1_31957}PHPChina 开源社区门户~:vR,[0jqxC

;a9/7W|k,y31957if(!fwrite($fso,$pagedata)){//写入字节流,serialize写入其他格式
x,Ow�p /;n2C31957
/o�D{qto#VK$uC31957$this->warns('无法写入缓存文件.');//trigger_error
R*xs�ry9g;w,`k[31957
{cftpi.bJ}31957return false;
iGM.e'rGN!t7H31957PHPChina 开源社区门户p8sk-u ORh o
}
']a4BR-G2d0i#{&ce#a31957PHPChina 开源社区门户2L&d-H y:@Ej
flock($fso,LOCK_UN);//释放锁定
&@4M'wAA.O.n/{S31957
_u,EY!q1[31957fclose($fso);
A_6sD"Z[{B31957PHPChina 开源社区门户 m+il(t#X(c4a
return true;PHPChina 开源社区门户�s+_ T$^e.Lf1~

8N;d-x5u'Ac!nrU�J3{ J31957}

function display_cache($cacheFile){
4H$X*/$I&g`Y_31957PHPChina 开源社区门户1g-FW4b]3KVk i
if(!file_exists($cacheFile)){
NQG1_J'hN|31957
3/E&~2e j31957$this->warn('无法读取缓存文件.');//trigger_errorPHPChina 开源社区门户;p b|o%NcRr
PHPChina 开源社区门户)o.A-o&K-E;}c
return false;PHPChina 开源社区门户[2Dl0m}n9uz!U
PHPChina 开源社区门户 }1Hm_Z+@8KQ
}
2xrA0^.G$~3|o _.q31957
k+f pP_GPo2wGx31957echo '读取缓存文件:'.$cacheFile;
.@K-s^r BJ~M31957PHPChina 开源社区门户:N c^#T!R!{.P s3V
//return unserialize(file_get_contents($cacheFile));
x)T;B:P{'^[31957PHPChina 开源社区门户._�T)|)?y5IK.h6?
$fso = fopen($cacheFile, 'r');
pE ^lUk31957
8e$jF6O,U1j3^"uDa31957$data = fread($fso, filesize($cacheFile));PHPChina 开源社区门户0~A _rd _
PHPChina 开源社区门户wi-cq%Rzn{
fclose($fso);
VL$W_G%rP Yk&O~31957PHPChina 开源社区门户hO;H8T'Kj
return $data;PHPChina 开源社区门户6^RWh8{:@;B'B?.W2a
PHPChina 开源社区门户G C"dE0JrE;[
}

function readData($cacheFile='default_cache.txt'){
-g}h$F-X31957
(/MoJ*S }31957$cacheFile = $this->cache_dir."/".$cacheFile;PHPChina 开源社区门户&JB ^d'B&@1@]
PHPChina 开源社区门户3X7Vp(b?b9~"n
if(file_exists($cacheFile)&&filemtime($cacheFile)>(time()-$this->expireTime)){PHPChina 开源社区门户"YWHxaG

5x[&_{vpR31957$data=$this->display_cache($cacheFile);
e4U yH(]3QW31957PHPChina 开源社区门户J)Hz6L0Q5x @c
}else{
#t:YnS7s)^6wq31957PHPChina 开源社区门户4a+h-k;o p7l|#V�|
$data="from here wo can get it from mysql database,update time is <b>".date('l dS /of F Y h:i:s A')."</b>,过期时间是:".date('l dS /of F Y h:i:s A',time()+$this->expireTime)."----------";PHPChina 开源社区门户"d8mU f-LES)Y

q1@|:KR&`!b[31957$this->cache_page($cacheFile,$data);PHPChina 开源社区门户9vZ9IHgxB2q

9VbP4p/T:?u31957}PHPChina 开源社区门户S0e Y�u9}2W

;v.ls/i&@#y4lr"H31957return $data;PHPChina 开源社区门户:e*a$X5q LL/s

r,K#i$f-j$IRZ31957}

}
C?n}A CjR31957PHPChina 开源社区门户`0eF:u%X,T�C
?>

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值