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@7ib+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.
kKv;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/aiI8FA,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.AB
}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 eL#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 开源社区门户T7kKJc/A7`!Y7s
}

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

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
'TEX |�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);
e4UyH(]3QW31957PHPChina 开源社区门户J)Hz6L0Q5x @c
}else{
#t:YnS7s)^6wq31957PHPChina 开源社区门户4a+h-k;op7l|#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常用缓存技术的总结

1、全页面静态化缓存:将页面全部生成为HTML静态页面,用户访问时直接访问静态页面,不走PHP服务器的解析流程。此种方式在CMS系统中比较常见,如dedecms。 实现方法:输出缓存 ob_sta...
  • ym_diver
  • ym_diver
  • 2017年07月01日 18:23
  • 188

浅谈php的缓存机制之redis

适合刚学习redis的读读,直接上代码吧,全是基础,全有注释
  • u010674395
  • u010674395
  • 2015年07月09日 14:55
  • 2234

基础知识之php页面缓存实现方法总结

PHP页面缓存实现的方法总结 在php页面缓存主要用到的是ob系列函数: ob_start():页面缓存开始的标志,此函数一下的内容直至ob_end_flush()或者ob_end_clean()...
  • hanjianqiang2468
  • hanjianqiang2468
  • 2016年09月21日 19:26
  • 2094

缓存技术,封装好的缓存类

using System; using System.Collections.Generic; using System.Linq; using System.Web; using EnYuan.BS...
  • lybwwp
  • lybwwp
  • 2014年01月14日 08:59
  • 3110

php缓存技术之静态缓存

缓存技术 1.静态缓存 2.Memcache redis缓存 静态缓存 保存在磁盘上的静态文件,用PHP生成数据放入静态文件中 PHP操作缓存 1.生成缓存 2.获取缓存 3.删除缓存...
  • ghostyusheng
  • ghostyusheng
  • 2016年02月18日 14:23
  • 2601

php apc缓存以及与redis的对比

APC简介 APC的全称为Alternative PHP Cache, 是一款开源的php插件,用来对php的代码或者用户数据进行缓存。 APC 对php代码的缓存 apc可以去...
  • w18704622664
  • w18704622664
  • 2015年07月29日 18:31
  • 3307

PHP之分布式缓存memcached熟悉和操作

如今互联网崛起的时代,各大网站都面临着一个大数据流问题,怎么提高网站访问速度,减少对数据库的操作;作为PHP开发人员,我们一般能想到的方法有页面静态化处理、防盗链、CDN内容分发加速访问、mysql数...
  • wyz365889
  • wyz365889
  • 2015年03月25日 00:25
  • 2573

PHP Redis 缓存实例

还在学习redis中,所以本文会持续更新 学习redis一段时间了,发现在网上都有说到使用场景,但是很少具体的实例 下面是我自己通过学习总结出的简单实例,如果有哪里不对欢迎指出 1、使用re...
  • cc2415
  • cc2415
  • 2017年09月30日 10:41
  • 641

PHP缓存锁原理及利用

概述:项目当中经常要考虑数据高并发的情况,为了避免并发导致出现一些资源重复请求的问题,可以使用缓存加锁机制。 例如取微信access_token不加锁可能会导致非常严重的后果。准备:缓存锁,顾名思义...
  • Tim_phper
  • Tim_phper
  • 2017年02月09日 17:19
  • 802

php文件缓存技术实现代码

下面是一个php缓存文件实现类,根据我的经验,缓存文件是根据用户设置的时间与文件生成的日间以及当前时间进行比较,然后再判断是否需要重新生成缓存文件。*/...
  • kurt1988
  • kurt1988
  • 2014年05月12日 09:43
  • 540
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:php 缓存技术
举报原因:
原因补充:

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