php缓存技术介绍


Posted in PHP onNovember 25, 2006

缓存是指临时文件交换区,电脑把最常用的文件从存储器里提出来临时放在缓存里,就像把工具和材料搬上工作台一样,这样会比用时现去仓库取更方便。因为缓存往往使用的是RAM(断电即掉的非永久储存),所以在忙完后还是会把文件送到硬盘等存储器里永久存储。电脑里最大的缓存就是内存条了,最快的是CPU上镶的L1和L2缓存,显卡的显存是给GPU用的缓存,硬盘上也有16M或者32M的缓存。千万不能把缓存理解成一个东西,它是一种处理方式的统称!

在WEB开发中用来应付高流量最有效的办法就是用缓存技术,能有效的提高服务器负载性能,用空间换取时间。

互联网也是2 8定论,就像百度搜索中的关键字一样,80%的人所搜索的肯定就是 20%的内容,所以只需要把这 20%的关键字的内容绶存好就可以很有效的在数十亿的记录中快速的返回给用户需要的内容。

这编文章我们来看一下在PHP WEB开发中常用的一些绶存手段。

1、普遍缓存技术:

数据缓存:这里所说的数据缓存是指数据库查询PHP缓存机制,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓存表或文件中获得。

用的最广的例子看Discuz的搜索功能,把结果ID缓存到一个表中,下次搜索相同关键字时先搜索缓存表。

举个常用的方法,多表关联的时候,把附表中的内容生成数组保存到主表的一个字段中,需要的时候数组分解一下,这样的好处是只读一个表,坏处就是两个数据同步会多不少步骤,数据库永远是瓶颈,用硬盘换速度,是这个的关键点。

2、 页面缓存:

每次访问页面的时候,都会先检测相应的缓存页面文件是否存在,如果不存在,就连接数据库,得到数据,显示页面并同时生成缓存页面文件,这样下次访问的时候页面文件就发挥作用了。(模板引擎和网上常见的一些PHP缓存机制类通常有此功能)

3、 时间触发缓存:

检查文件是否存在并且时间戳小于设置的过期时间,如果文件修改的时间戳比当前时间戳减去过期时间戳大,那么就用缓存,否则更新缓存。

4、 内容触发缓存:

当插入数据或更新数据时,强制更新PHP缓存机制。

5、 静态缓存:

这里所说的静态缓存是指静态化,直接生成HTML或XML等文本文件,有更新的时候重生成一次,适合于不太变化的页面,这就不说了。

以上内容是代码级的解决方案,我直接CP别的框架,也懒得改,内容都差不多,很容易就做到,而且会几种方式一起用,但下面的内容是服务器端的缓存方案,非代码级的,要有多方的合作才能做到

6、 内存缓存:

Memcached是高性能的,分布式的内存对象PHP缓存机制系统,用于在动态应用中减少数据库负载,提升访问速度。

7、 php的缓冲器:

有eaccelerator, apc, phpa,xcache,这个这个就不说了吧,搜索一堆一堆的,自己看啦,知道有这玩意就OK

8、 MYSQL缓存:

这也算非代码级的,经典的数据库就是用的这种方式,看下面的运行时间,0.09xxx之类的

9、 基于反向代理的Web缓存:

如Nginx,SQUID,mod_proxy(apache2以上又分为mod_proxy和mod_cache)

10、 DNS轮询:  

BIND是一款开放源码的DNS服务器软件,这个要说起来就大了,自己搜索去,大家知道有这个东西就行了。

我知道的有chinacache等大站就是这样做的,说简单点就是多服务器啦,把同一个页面或文件缓存到不同的服务器上,按南北自动解析到相关的服务器中。

为什么要使用缓存技术?理由很简单:提高效率。在程序开发中,获取信息的方式主要是查询数据库,除此以外,也可能是通过Web Services或者别的某种方法,无论哪种方法,在大量的并发访问面前,它们都可能成为效率的瓶颈,为了解决这些问题,人们提出了很多解决方案,其中一些是利用优化软件(如:APC,Eaccelerator,Zend Optimizer等等)来提高程序的运行效率,合理的运用这些软件,往往能使程序的运行效率得到数量级上的提升,但前提是你必须拥主机的控制权,以便能够安装这些软件,如果你使用的是虚拟主机的话,那么只能祈祷你的服务提供商已经预装了某个优化软件,否则就必须自己使用PHP来实现相应的缓存功能。如果这让你感到无所适从,相信下面的文字能给你一些启发。

很多PHP程序员都使用Adodb+Smarty这样的黄金搭档,那么就先看看如何使用它们的缓存功能。

首先看看adodb提供的数据缓存功能:

<?php
include('adodb.inc.php'); # load code common to ADOdb 
$ADODB_CACHE_DIR = '/usr/ADODB_cache'; 
$conn = &ADONewConnection('mysql');  # create a connection 
$conn->PConnect('localhost','userid','','agora');# connect to MySQL, agora db 
$sql = 'select CustomerName, CustomerID from customers'; 
$rs = $conn->CacheExecute(15,$sql); 
?>

如上,每次查询数据的时候,会把相应的结果序列化后保存到文件中,以后同样的查询语句就可以不用直接查询数据库,而是从缓存文件中获得。

再来看看Smarty提供的页面缓存功能:

<?php
require('Smarty.class.php');
$smarty = new Smarty;

$smarty->caching = true;

if(!$smarty->is_cached('index.tpl')) {
    // No cache available, do variable assignments here.
    $contents = get_database_contents();
    $smarty->assign($contents);
}

$smarty->display('index.tpl');
?>

如上,每次访问页面的时候,都会先检测相应的缓存是否存在,如果不存在,就连接数据库,得到数据,完成模板变量的赋值,显示页面,同时生成缓存文件,这样下次访问的时候缓存文件就发挥作用了,而不会再执行if块的数据查询语句了。当然,在实际使用中会有很多东西要考虑,比如,有效期的设置,缓存组的设置等等,具体可以查看Smarty手册中有关缓存(caching)的相关章节。

以上两个PHP流行组件缓存方式的侧重点是不同的,对于Adodb的缓存而言,它缓存的是数据,对于Smarty的缓存而言,它缓存的是页面。其他提供缓存功能的组件还有很多(如:PEAR::Cache_Lite等等),实际编程中使用哪个方案要具体情况具体分析,也可能会综合使用。

使用这些组件内置的缓存方案有一个很明显的好处是它们的实现对客户端而言都很透明。只要进行必要的设置(如:缓存时间,缓存目录等等)就可以了,而不用过多考虑实现缓存的细节问题,系统会根据设置自动管理缓存。但是其缺点也同样明显,因为每次请求仍然要用PHP解析一遍,效率和纯静态相比还是大打折扣,在大的PV面前还是不能满足要求,在这种情况下,仅仅做动态缓存就不够了,必须实现静态缓存。

PHP 相关文章推荐
怎样在UNIX系统下安装php3
Oct 09 PHP
PHP 向右侧拉菜单实现代码,测试使用中
Nov 03 PHP
PHP中防止SQL注入实现代码
Feb 19 PHP
php获取post中的json数据的实现方法
Jun 08 PHP
如何在HTML 中嵌入 PHP 代码
May 13 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
Mar 17 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
Apr 11 PHP
Windows2003下php5.4安装配置教程(IIS)
Jun 30 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
Dec 02 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
Aug 02 PHP
解决php extension 加载顺序问题
Aug 16 PHP
Laravel5.1 框架路由基础详解
Jan 04 PHP
phpmyadmin的#1251问题
Nov 25 #PHP
mysql5写入和读出乱码解决
Nov 25 #PHP
WINXP下apache+php4+mysql
Nov 25 #PHP
PHP的中问验证码
Nov 25 #PHP
mysql建立外键
Nov 25 #PHP
ADODB结合SMARTY使用~超级强
Nov 25 #PHP
ADODB类使用
Nov 25 #PHP
You might like
PHP连接和操作MySQL数据库基础教程
2014/09/29 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
PHP判断是否微信访问的方法示例
2019/03/27 PHP
function foo的原型与prototype属性解惑
2010/11/19 Javascript
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
用js判断页面是否加载完成实现代码
2012/12/11 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
2015/03/18 Javascript
jQuery仿gmail实现fixed布局的方法
2015/05/27 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
2016/07/15 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
2019/02/19 jQuery
搭建Python的Django框架环境并建立和运行第一个App的教程
2016/07/02 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
浅析python3中的os.path.dirname(__file__)的使用
2018/08/30 Python
解决Python一行输出不显示的问题
2018/12/03 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
淘宝秒杀python脚本 扫码登录版
2019/09/19 Python
python文字转语音的实例代码分析
2019/11/12 Python
Python面向对象原理与基础语法详解
2020/01/02 Python
Python3爬虫里关于Splash负载均衡配置详解
2020/07/10 Python
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
波兰快递服务:Globkurier.pl
2019/11/08 全球购物
.net面试题
2016/09/17 面试题
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
安全承诺书范文
2014/03/26 职场文书
导师就业推荐信范文
2014/05/22 职场文书
文明城市标语
2014/06/16 职场文书
三潭印月的导游词
2015/02/12 职场文书
2015年中秋节活动总结
2015/03/23 职场文书
环境卫生整治简报
2015/07/20 职场文书
Java网络编程之UDP实现原理解析
2021/09/04 Java/Android
Python用any()函数检查字符串中的字母以及如何使用all()函数
2022/04/14 Python