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中判断一个字符串包含另一个字符串的方法
Mar 19 PHP
php学习 函数 课件
Jun 15 PHP
比较详细PHP生成静态页面教程
Jan 10 PHP
深入HTTP响应状态码速查表的详解
Jun 07 PHP
php实现在服务器上创建目录的方法
Mar 16 PHP
php用户注册信息验证正则表达式
Nov 12 PHP
PHP实现微信网页授权开发教程
Jan 19 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
Sep 20 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
Feb 28 PHP
Laravel validate error处理,ajax,json示例
Oct 25 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
Apr 26 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学习笔记(毕业设计)
2012/02/21 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
2017/03/01 PHP
关于PHP求解三数之和问题详析
2020/11/09 PHP
jquery 插件之仿“卓越亚马逊”首页弹出菜单效果
2008/12/25 Javascript
Javascript(AJAX)解析XML的代码(兼容FIREFOX/IE)
2010/07/11 Javascript
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
jQuery实现的左右移动焦点图效果
2016/01/14 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
ReactNative页面跳转实例代码
2016/09/27 Javascript
js闭包用法实例详解
2016/12/13 Javascript
Vuex之理解Mutations的用法实例
2017/04/19 Javascript
Angularjs修改密码的实例代码
2017/05/26 Javascript
Javascript继承机制详解
2017/05/30 Javascript
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
python连接MySQL、MongoDB、Redis、memcache等数据库的方法
2013/11/15 Python
python爬虫基本知识
2018/03/05 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
python禁用键鼠与提权代码实例
2019/08/16 Python
Python实现屏幕录制功能的代码
2020/03/02 Python
Pytorch mask-rcnn 实现细节分享
2020/06/24 Python
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
计算机专业推荐信范文
2013/11/20 职场文书
银行办公室岗位职责
2014/03/10 职场文书
投标人法定代表人授权委托书格式
2014/09/28 职场文书
学校教师师德师风承诺书
2015/04/28 职场文书
导游词之清晏园
2019/11/22 职场文书
JS实现简单控制视频播放倍速的实例代码
2021/04/18 Javascript
Windows环境下实现批量执行Sql文件
2021/10/05 SQL Server
vue如何实现关闭对话框后刷新列表
2022/04/08 Vue.js
MySQL 字符集 character
2022/05/04 MySQL