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 相关文章推荐
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
May 03 PHP
PHP 编程的 5个良好习惯
Feb 20 PHP
php 连接mssql数据库 初学php笔记
Mar 01 PHP
php数组函数序列之array_search()- 按元素值返回键名
Nov 04 PHP
php urlencode()与urldecode()函数字符编码原理详解
Dec 06 PHP
PHP写UltraEdit插件脚本实现方法
Dec 26 PHP
PHP使用DES进行加密与解密的方法详解
Jun 06 PHP
探讨:php中在foreach中使用foreach ($arr as &amp;$value) 这种类型的解释
Jun 24 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
Oct 09 PHP
PHP的Yii框架中Model模型的学习教程
Mar 29 PHP
关于php几种字符串连接的效率比较(详解)
Feb 22 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
Jun 12 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分页显示制作详细讲解
2006/10/09 PHP
PHP处理JSON字符串key缺少双引号的解决方法
2014/09/16 PHP
PHP上传文件及图片到七牛的方法
2018/07/25 PHP
Ext grid 添加右击菜单
2009/11/26 Javascript
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
FF IE浏览器修改标签透明度的方法
2014/01/27 Javascript
JavaScript制作的可折叠弹出式菜单示例
2014/04/04 Javascript
JQuery select(下拉框)操作方法汇总
2015/04/15 Javascript
jQuery解析XML文件同时动态增加js文件的方法
2015/06/01 Javascript
利用原生js和jQuery实现单选框的勾选和取消操作的方法
2016/09/04 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
Angular5给组件本身的标签添加样式class的方法
2018/04/07 Javascript
vue+springboot实现项目的CORS跨域请求
2018/09/05 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
2019/04/07 Javascript
详解babel升级到7.X采坑总结
2019/05/12 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
JS数组方法slice()用法实例分析
2020/01/18 Javascript
js瀑布流布局的实现
2020/06/28 Javascript
python中getaddrinfo()基本用法实例分析
2015/06/28 Python
Python中在for循环中嵌套使用if和else语句的技巧
2016/06/20 Python
Python3之读取连接过的网络并定位的方法
2018/04/22 Python
对pandas中Series的map函数详解
2018/07/25 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
python实现得到当前登录用户信息的方法
2019/06/21 Python
pandas 数据结构之Series的使用方法
2019/06/21 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
Python命名空间及作用域原理实例解析
2020/08/12 Python
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
联想香港官方网站及网店:Lenovo香港
2018/04/13 全球购物
如何开启linux的ssh服务
2013/06/03 面试题
干部选拔任用方案
2014/05/26 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
2014年评职称工作总结
2014/11/20 职场文书
2015年社区卫生工作总结
2015/04/21 职场文书
青少年法制教育心得体会
2016/01/14 职场文书
幼儿园2016年圣诞活动总结
2016/03/31 职场文书