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 相关文章推荐
PHP 中的一些经验积累
Oct 09 PHP
坏狼的PHP学习教程之第1天
Jun 15 PHP
一个PHP数组应该有多大的分析
Jul 30 PHP
PHP 类商品秒杀计时实现代码
May 05 PHP
通达OA公共代码 php常用检测函数
Dec 14 PHP
php 函数中使用static的说明
Jun 01 PHP
PHP setTime 设置当前时间的代码
Aug 27 PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
May 13 PHP
php自动提交表单的方法(基于fsockopen与curl)
May 09 PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
Jul 18 PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
Aug 03 PHP
php的RSA加密解密算法原理与用法分析
Jan 23 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写的采集程序
2007/03/16 PHP
解析link_mysql的php版
2013/06/30 PHP
thinkphp实现like模糊查询实例
2014/10/29 PHP
WordPress中获取指定分类及其子分类下的文章数目
2015/12/31 PHP
PHP使用ActiveMQ实例
2018/02/05 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
javascript基础第一章 JavaScript与用户端
2010/07/22 Javascript
基于Jquery的标签智能验证实现代码
2010/12/27 Javascript
jquery动画1.加载指示器
2012/08/24 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
2015/06/18 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
JQuery操作textarea,input,select,checkbox方法
2015/09/02 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
原生js封装二级城市下拉列表的实现代码
2016/06/16 Javascript
javascript实现数据双向绑定的三种方式小结
2017/03/09 Javascript
从零开始学习Node.js系列教程五:服务器监听方法示例
2017/04/13 Javascript
JS中图片压缩的方法小结
2017/11/14 Javascript
javascript将json格式数组下载为excel表格的方法
2017/12/22 Javascript
详解vue通过NGINX部署在子目录或者二级目录实践
2018/09/03 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
python线程锁(thread)学习示例
2013/12/04 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
Python二进制串转换为通用字符串的方法
2018/07/23 Python
Python爬虫框架scrapy实现的文件下载功能示例
2018/08/04 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
2019/09/04 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
Python生成器传参数及返回值原理解析
2020/07/22 Python
python制作一个简单的gui 数据库查询界面
2020/11/19 Python
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
波兰在线运动商店:YesSport
2020/07/23 全球购物
买房子个人收入证明
2014/01/16 职场文书
计算机系本科生求职信
2014/05/31 职场文书
师德师风培训感言
2015/08/03 职场文书
阿里云 Windows server 2019 配置FTP
2022/04/28 Servers
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS