php 缓存技术

原创 2007年09月19日 09:30:00

一、引论

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$K e
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;
_de k${-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%P w 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_�I a)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!p L/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
+F Lca)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
{c ftpi.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'h N|31957
3/E&~2e j31957$this->warn('无法读取缓存文件.');//trigger_errorPHPChina 开源社区门户;p b|o%NcR r
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^R Wh8{:@;B'B?.W2a
PHPChina 开源社区门户G C"dE0J rE;[
}

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
?>

 

相关文章推荐

PHP中Memcache缓存技术的使用

  • 2015年08月31日 10:52
  • 87KB
  • 下载

php缓存技术

  • 2012年05月02日 19:49
  • 67KB
  • 下载

php缓存技术详解

一、缓存技术:    有些信息比方经常不变的,但是还是能变的信息放在缓存中以加快显示速度,这是很有价值的,所谓的缓存,通俗的理解就是一些保存在服务器端的共用信息.它是于服务器同生死的,我们在保存...

php缓存技术总结

全页面静态化缓存     也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程。此种方式,在CMS系统中比较常见,比如dedecms;     一种比...

php缓存学习相关技术

  • 2011年09月06日 11:05
  • 767KB
  • 下载

PHP企业级应用之常见缓存技术深入解读

本文主要讲解PHP企业级应用之常见缓存技术,从基本的PHP缓存概念到技术代码的实现都深入做了解读。数据缓存:这里所说的数据缓存是指数据库查询缓存。  普遍缓存技术数据缓存:这里所说的数据缓存是指数据...

基础知识之PHP缓存技术

普遍缓存技术 数据缓存:这里所说的数据缓存是指数据库查询缓存,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中,以后同样的查...

深入理解PHP高级技巧、面向对象与核心技术之调整浏览器缓存

缓存页面是保存页面的内容的一种方式,然后在产生请求时提供这个保存的页面版本,而不是服务器上的版本。 对于动态的、PHP驱动的站点,有时我们需要确保终端用户获得的是最新的版本。 利用PHP的header...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:php 缓存技术
举报原因:
原因补充:

(最多只允许输入30个字)