PHP网页缓存技术优点及代码实例


Posted in PHP onJuly 29, 2020

前台静态化:把动态页面解析后保存为静态页面

文件缓存:把查询结果保存为文件,XML

内存缓存:memcache

php缓存器:XCache、eaccelerator等

Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。

Memcache是danga的一个项目,最早是LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。

Memcached是以守护程序方式运行于一个或多个服务器中,随时会接收客户端的连接和操作。

XCache 是一个开源的 opcode 缓存器/优化器, 这意味着他能够提高您服务器上的 PHP 性能. 他通过把编译 PHP 后的数据缓冲到共享内存从而避免重复的编译过程, 能够直接使用缓冲区已编译的代码从而提高速度. 通常能够提高您的页面生成速率 2 到5 倍, 降低服务器负载.

******************************************************************************************************************************************************

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等大站就是这样做的,说简单点就是多服务器啦,把同一个页面或文件缓存到不同的服务器上,按南北自动解析到相关的服务器中。

PHP网页缓存实例

  • ob_start():页面缓存开始的标志,此函数一下的内容直至ob_end_flush()或者ob_end_clean()都保存在页面缓存中;
  • ob_get_contents():用来获取页面缓存中的内容,获取到以后呢,我们就可以想怎么处理这些内容都行了,过滤字段啦,匹配内容啦,都可以~~~ :)
  • ob_end_flush():表示页面缓存结束。并且经我验证,缓存的内容将输出到当前页面上,也就是可以显示缓存内容。

用此三个php函数,就可以实现强大的功能。如果数据库查询量较大,可以用cache来解决这个问题。

首先,设定过期时间,如果要求缓存文件2个小时过期,就可以设定cache_time为3600*2;通过filectime()来获取缓存文件的创建时间(或 filemtime()获取修改时间),如果当前时间跟文件的创建时间超过限定的过期时间,就可以通过上面三个函数,首先从数据库中取出数据,然后开始缓存ob_start(),然后把要生成的页面的html代码写在缓存中,缓存结束后通过ob_get_contents()获取到缓存的内容,然后通过fwrite把缓存内容写到静态页面html。

如果未过期,直接读取cache中的静态页面即可,避免了大量的数据库访问。

<?php
$_time =10;
$dir="D:\\php\\";
 
function cache_start($_time, $dir)
{
 $cachefile = $dir.'/'.sha1($_SERVER['REQUEST_URI']).'.html';
 $cachetime = $_time;
 ob_start();
 if(file_exists($cachefile) && (time()-filemtime($cachefile) < $cachetime))
 {
  include($cachefile);
  ob_end_flush();
  exit;
 }
}
 
function cache_end($dir)
{
 $cachefile = $dir.'/'.sha1($_SERVER['REQUEST_URI']).'.html';
 $fp = fopen($cachefile, 'w');
 fwrite($fp, ob_get_contents());
 fclose($fp);
 ob_end_flush();
}
 
cache_start($_time, $dir);
//以下是输出的内容,放在cache_start和cache_end两个方法之间
for ($i=0;$i<5;$i++)
{
 echo $i;
 sleep(1);
}
cache_end($dir);
?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php设计模式之命令模式的应用详解
May 21 PHP
解决PHP超大文件下载,断点续传下载的方法详解
Jun 06 PHP
php网站判断用户是否是手机访问的方法
Nov 01 PHP
php使用GeoIP库实例
Jun 27 PHP
PHP产生不重复随机数的5个方法总结
Nov 12 PHP
PHP7.0版本备注
Jul 23 PHP
php邮箱地址正则表达式验证
Nov 13 PHP
php数组函数array_key_exists()小结
Dec 10 PHP
php基于dom实现的图书xml格式数据示例
Feb 03 PHP
PHP获取数组中单列值的方法
Jun 10 PHP
php的无刷新操作实现方法分析
Feb 28 PHP
thinkphp5.1框架模板赋值与变量输出示例
May 25 PHP
phpStudy vscode 搭建debug调试的教程详解
Jul 28 #PHP
jQuery+PHP实现图片上传并提交功能
Jul 27 #PHP
关于PHP中interface的用处详解
Jul 26 #PHP
Laravel中如何轻松容易的输出完整的SQL语句
Jul 26 #PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
Jul 24 #PHP
php实现商城购物车的思路和源码分析
Jul 23 #PHP
PHP安全之register_globals的on和off的区别
Jul 23 #PHP
You might like
简化php模板页面中分页代码的解析
2009/02/06 PHP
php数组中删除元素的实现代码
2012/06/22 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
2015/04/20 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
2020/03/02 PHP
JScript内置对象Array中元素的删除方法
2007/03/08 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
2013/01/27 Javascript
js中iframe调用父页面的方法
2014/10/30 Javascript
js简单倒计时实现代码
2016/04/30 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
2016/08/17 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
Vue.js实现文章评论和回复评论功能
2020/05/30 Javascript
本地搭建微信小程序服务器的实现方法
2017/10/27 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
2018/03/05 Javascript
解决vue移动端适配问题
2018/12/12 Javascript
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
vue实现选中效果
2020/10/07 Javascript
Python实现基于权重的随机数2种方法
2015/04/28 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
2017/08/25 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
PyCharm在新窗口打开项目的方法
2019/01/17 Python
python实现控制COM口的示例
2019/07/03 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
2019/08/30 Python
Python @property及getter setter原理详解
2020/03/31 Python
CSS3 实现时间轴动画
2020/11/25 HTML / CSS
详解HTML5 Canvas绘制时指定颜色与透明度的方法
2016/03/25 HTML / CSS
法国时尚品牌乐都特瑞士站:La Redoute瑞士
2016/09/05 全球购物
巴西香水和化妆品购物网站:The Beauty Box
2019/09/03 全球购物
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
工伤赔偿协议书范本
2014/04/15 职场文书
精神文明建设先进工作者事迹材料
2014/05/02 职场文书
申论倡议书范文
2014/05/13 职场文书
学校党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书
Redis中一个String类型引发的惨案
2021/07/25 Redis
漫画「古见同学有交流障碍症」第25卷封面公开
2022/03/21 日漫