扣丁学堂浅谈php缓存技术及php缓存实现代码详解
2017-12-12 14:31:43
679浏览
在现如今,随着互联网时代信息日夜更新,比如有些信息经常不变的,但是还是能变的信息放在缓存中以加快显示速度,这是很有价值的,所谓的缓存,通俗的理解就是一些保存在服务器端的共用信息.它是于服务器同生死的,我们在保存缓存的时候可以指定下次更新的时间的判断,比方要在5分钟更新一次,那么下面我们一起来看下扣丁学堂PHP视频教程之PHP缓存实现代码的详细介绍吧。
数据缓存:这里所说的数据缓存是指数据库查询PHP缓存机制,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓存表或文件中获得。
用的最广的例子看Discuz的搜索功能,把结果ID缓存到一个表中,下次搜索相同关键字时先搜索缓存表。
举个常用的方法,多表关联的时候,把附表中的内容生成数组保存到主表的一个字段中,需要的时候数组分解一下,这样的好处是只读一个表,坏处就是两个数据同步会多不少步骤,数据库永远是瓶颈,用硬盘换速度,是这个的关键点。
页面缓存:每次访问页面的时候,都会先检测相应的缓存页面文件是否存在,如果不存在,就连接数据库,得到数据,显示页面并同时生成缓存页面文件,这样下次访问的时候页面文件就发挥作用了。(模板引擎和网上常见的一些PHP缓存机制类通常有此功能)
时间触发缓存:检查文件是否存在并且时间戳小于设置的过期时间,如果文件修改的时间戳比当前时间戳减去过期时间戳大,那么就用缓存,否则更新缓存。
内容触发缓存:当插入数据或更新数据时,强制更新PHP缓存机制。
静态缓存:这里所说的静态缓存是指静态化,直接生成HTML或XML等文本文件,有更新的时候重生成一次,适合于不太变化的页面,这就不说了。
内存缓存:Memcached是高性能的,分布式的内存对象PHP缓存机制系统,用于在动态应用中减少数据库负载,提升访问速度。
php的缓冲器:有eaccelerator,apc,phpa,xcache,这个这个就不说了吧,搜索一堆一堆的,自己看啦,知道有这玩意就OK
MYSQL缓存:这也算非代码级的,经典的数据库就是用的这种方式,看下面的运行时间,0.09xxx之类的
我贴段根据蓝色那家伙修改后部分my.ini吧,2G的MYISAM表可以在0.05S左右,据说他前后改了有快一年
基于反向代理的Web缓存:如Nginx,SQUID,mod_proxy(apache2以上又分为mod_proxy和mod_cache)
NGINX的例子
用google找到一些php缓存技术方法,发个PHP缓存实现,实现了apc和文件缓存,继承Cache_Abstract即可实现调用第三方的缓存工具。
isLocked($key)){
return$this;
}
$tries=10;
$count=0;
do{
usleep(200);
$count++;
}while($count<=$tries&&$this->isLocked($key));//最多做十次睡眠等待解锁,超时则跳过并解锁
$this->isLocked($key)&&$this->unlock($key);
return$this;
}
}
/**
*APC扩展缓存实现
*
*
*@categoryMjie
*@packageCache
*@author流水孟春
*@copyrightCopyright(c)2008-
*@licenseNewBSDLicense
*@version$Id:Cache/Apc.php版本号2010-04-1823:02cmpan$
*/
classCache_ApcextendsCache_Abstract{
protected$_prefix='cache.mjie.net';
publicfunction__construct(){
if(!function_exists('apc_cache_info')){
thrownewCacheException('apcextensiondidn'tinstalled');
}
}
/**
*保存缓存变量
*
*@paramstring$key
*@parammixed$value
*@returnbool
*/
publicfunctionstore($key,$value){
returnapc_store($this->_storageKey($key),$value);
}
/**
*读取缓存
*
*@paramstring$key
*@returnmixed
*/
publicfunctionfetch($key){
returnapc_fetch($this->_storageKey($key));
}
/**
*清除缓存
*
*@returnCache_Apc
*/
publicfunctionclear(){
apc_clear_cache();
return$this;
}
/**
*删除缓存单元
*
*@returnCache_Apc
*/
publicfunctiondelete($key){
apc_delete($this->_storageKey($key));
return$this;
}
/**
*缓存单元是否被锁定
*
*@paramstring$key
*@returnbool
*/
publicfunctionisLocked($key){
if((apc_fetch($this->_storageKey($key).'.lock'))===false){
returnfalse;
}
returntrue;
}
/**
*锁定缓存单元
*
*@paramstring$key
*@returnCache_Apc
*/
publicfunctionlock($key){
apc_store($this->_storageKey($key).'.lock','',5);
return$this;
}
/**
*缓存单元解锁
*
*@paramstring$key
*@returnCache_Apc
*/
publicfunctionunlock($key){
apc_delete($this->_storageKey($key).'.lock');
return$this;
}
/**
*完整缓存名
*
*@paramstring$key
*@returnstring
*/
privatefunction_storageKey($key){
return$this->_prefix.'_'.$key;
}
}
/**
*文件缓存实现
*
*
*@categoryMjie
*@packageCache
*@author流水孟春
*@copyrightCopyright(c)2008-
*@licenseNewBSDLicense
*@version$Id:Cache/File.php版本号2010-04-1816:46cmpan$
*/
classCache_FileextendsCache_Abstract{
public$useSubdir=false;
protected$_cachesDir='cache';
publicfunction__construct(){
if(defined('DATA_DIR')){
$this->_setCacheDir(DATA_DIR.'/cache');
}
}
/**
*获取缓存文件
*
*@paramstring$key
*@returnstring
*/
protectedfunction_getCacheFile($key){
$subdir=$this->useSubdir?substr($key,0,2).'/':'';
return$this->_cachesDir.'/'.$subdir.$key.'.php';
}
/**
*读取缓存变量
*为防止信息泄露,缓存文件格式为php文件,并以""开头
*
*@paramstring$key缓存下标
*@returnmixed
*/
publicfunctionfetch($key){
$cacheFile=self::_getCacheFile($key);
if(file_exists($cacheFile)&&is_readable($cacheFile)){
//include方式
//returninclude$cacheFile;
//系列化方式
returnunserialize(@file_get_contents($cacheFile,false,NULL,13));
}
returnfalse;
}
/**
*缓存变量
*为防止信息泄露,缓存文件格式为php文件,并以""开头
*
*@paramstring$key缓存变量下标
*@paramstring$value缓存变量的值
*@returnbool
*/
publicfunctionstore($key,$value){
$cacheFile=self::_getCacheFile($key);
$cacheDir=dirname($cacheFile);
if(!is_dir($cacheDir)){
if(!@mkdir($cacheDir,0755,true)){
thrownewCacheException("Couldnotmakecachedirectory");
}
}
//用include方式
//return@file_put_contents($cacheFile,''.serialize($value));
}
/**
*删除缓存变量
*
*@paramstring$key缓存下标
*@returnCache_File
*/
publicfunctiondelete($key){
if(emptyempty($key)){
thrownewCacheException("Missingargument1forCache_File::delete()");
}
$cacheFile=self::_getCacheFile($key);
if(!@unlink($cacheFile)){
thrownewCacheException("Cachefilecouldnotbedeleted");
}
return$this;
}
/**
*缓存单元是否已经锁定
*
*@paramstring$key
*@returnbool
*/
publicfunctionisLocked($key){
$cacheFile=self::_getCacheFile($key);
clearstatcache();
returnfile_exists($cacheFile.'.lock');
}
/**
*锁定
*
*@paramstring$key
*@returnCache_File
*/
publicfunctionlock($key){
$cacheFile=self::_getCacheFile($key);
$cacheDir=dirname($cacheFile);
if(!is_dir($cacheDir)){
if(!@mkdir($cacheDir,0755,true)){
if(!is_dir($cacheDir)){
thrownewCacheException("Couldnotmakecachedirectory");
}
}
}
//设定缓存锁文件的访问和修改时间
@touch($cacheFile.'.lock');
return$this;
}
/**
*解锁
*
*@paramstring$key
*@returnCache_File
*/
publicfunctionunlock($key){
$cacheFile=self::_getCacheFile($key);
@unlink($cacheFile.'.lock');
return
以上就是关于php缓存技术及php缓存实现代码的详细介绍,最后想要学习PHP开发技术的小伙伴不要犹豫了,扣丁学堂是
PHP培训技术的最佳选择,想要PHP视频教程的小伙伴现在就联系我们的咨询老师领取吧,机会总是留给有准备的人的!扣丁学堂
PHP开关工程师技术交流群:374332265。
【关注微信公众号免费领取丁豆获取更多的学习资料】
查看更多关于“php培训资讯”的相关文章>>
标签:
PHP开发工程师
PHP培训
PHP视频教程
PHP在线视频
php缓存技术