PHP缓存原理以及smarty缓存
2011-09-21 23:01
344 查看
前面学习过PHP缓冲技术,今天学习PHP的缓存技术,虽然一字之差,却也能说“谬以‘十’里”。
一、PHP缓存原理
当我们访问一个网站时,查询或者登陆,都会和通过数据库获得信息。像一个很大的门户网站,每日访问量上百万、千万,数据流通量是庞大的,所以通过PHP缓存技术能避免一些频繁而不必要的数据库操作,从而提高程序执行的效率。
来看一下几个PHP缓存技术:
1、数据缓存——普遍的一种缓存技术
非常直观的字面意思,就是把数据先存放好,减少对数据库的访问。第一次访问时,把要用到的数据保存到一个文件里,然后用户再次访问页面时,就先检测要查询的数据是否在缓存文件里,若存在,则直接取出,不需再次访问数据库。
一般这些数据以数组的形式保存,比如ecshop的缓存。
2、页面缓存
和数据缓存差不多,每次访问页面时,就检测相应的页面缓存是否存在,若不存在,则查询数据库得到相应的数据,同时生成缓存页面,这样,在下次访问就可以直接取出缓存页面,不必再次查询数据库。
3、内存缓存
不作过多分析,一般熟借助第三方软件进行优化,比如Memcached、dbcached。
以上方法能够解决频繁访问数据库的问题,但是缺乏时效性,在数据库改变后,他们默认的数据还是修改之前的。所以就要在规定时间内清除缓存,以更新数据。比如在每次更新缓存后设定一个时间戳t1,当前的时间戳t2,规定缓存时间为T,那么,在t1与t2相差在T之内时,就不更新缓存,否则,超过了T,就重新查询数据库,清除之前的缓存,又得到一个新的时间戳,依次循环下去。
二、smarty缓存
说到smarty又要注意两个概念:编译和缓存:smarty编译在默认情况下是开启的,而smarty缓存机制是要开发人员自己开启的。编译就是把smarty要编译的模板转换成PHP脚本程序,下次就可以直接访问编译好的PHP脚本程序,从而节省了程序执行的开销。
简单介绍一下smarty缓存技术:
1、开启缓存
要使用smarty缓存,首先开启缓存。先new一个smarty类,然后设置:$tpl = new Smarty();$tpl->caching = true;$tpl->cache_dir = '/cache/tp'
2、设定缓存更新周期
如果缓存永远不更新,那么网站就失去了动态性,下面就要设置一个缓存的更新周期:$tpl->cache_lifetime = 60*60; (以秒为单位)
另外对$tpl->caching要进行设置:
值为1:强迫不更新缓存: 值为2:在获取模板之前设置更新周期 值为0:强制不缓存,相当于false
所以设置更新周期cache_lifetime之前要设置caching = 2
3、一个模板,多个缓存
在缓存文章时,它们都用同一个模板,所以要区分开来。根据display或者fetch的第二个参数来设定:$tpl->display('article.php',$art_id)
4、is_cashed()更合理调用缓存
上面的一些缓存方法,虽然在下次访问页面不用在从数据库更新数据,但是之前的$sql查询数据库的语句还是执行的,这就增加了PHP的处理开销。
在执行$sql语句之前通过is_cached()判断缓存是否存在,例如:
if( is_cached(article.html))
{
$sql = ... //执行一系列$sql语句
}
$tpl->display('article.html');
当这个模板有多个缓存时,可以带上第二个参数:is_cached('article.html',$art_id)
5、局部缓存或者不缓存
我们可以指定缓存页面里的某个部分:
现在smarty的插件目录下顶一个个插件函数:block.cacheless.php,代码如下:
<?php
function smarty_block_cacheless($param, $content, &$smarty)
{
return $content;
}
?>
还要修改smarty里的Smarty _Compiler.class.php,找到下面一行,把true改成false:
$this->_plugins['block'][$tag_command] =array($plugin_func, null, null, null, true)
然后在页面里可以用这个方法指定缓存:
<%$smarty.now%>这里的缓存<cacheless> <br> <%$smarty.now%>这里的不缓存<%/cacheless%>
6、清除缓存
$tpl->clear_all_cache(); //清除所有缓存
$tpl->clear_cache('file.html'); //清除指定的缓存
$tpl->clear_cache('article.html',$art_id); //清除同一个模板下的指定缓存号的缓存
一、PHP缓存原理
当我们访问一个网站时,查询或者登陆,都会和通过数据库获得信息。像一个很大的门户网站,每日访问量上百万、千万,数据流通量是庞大的,所以通过PHP缓存技术能避免一些频繁而不必要的数据库操作,从而提高程序执行的效率。
来看一下几个PHP缓存技术:
1、数据缓存——普遍的一种缓存技术
非常直观的字面意思,就是把数据先存放好,减少对数据库的访问。第一次访问时,把要用到的数据保存到一个文件里,然后用户再次访问页面时,就先检测要查询的数据是否在缓存文件里,若存在,则直接取出,不需再次访问数据库。
一般这些数据以数组的形式保存,比如ecshop的缓存。
2、页面缓存
和数据缓存差不多,每次访问页面时,就检测相应的页面缓存是否存在,若不存在,则查询数据库得到相应的数据,同时生成缓存页面,这样,在下次访问就可以直接取出缓存页面,不必再次查询数据库。
3、内存缓存
不作过多分析,一般熟借助第三方软件进行优化,比如Memcached、dbcached。
以上方法能够解决频繁访问数据库的问题,但是缺乏时效性,在数据库改变后,他们默认的数据还是修改之前的。所以就要在规定时间内清除缓存,以更新数据。比如在每次更新缓存后设定一个时间戳t1,当前的时间戳t2,规定缓存时间为T,那么,在t1与t2相差在T之内时,就不更新缓存,否则,超过了T,就重新查询数据库,清除之前的缓存,又得到一个新的时间戳,依次循环下去。
二、smarty缓存
说到smarty又要注意两个概念:编译和缓存:smarty编译在默认情况下是开启的,而smarty缓存机制是要开发人员自己开启的。编译就是把smarty要编译的模板转换成PHP脚本程序,下次就可以直接访问编译好的PHP脚本程序,从而节省了程序执行的开销。
简单介绍一下smarty缓存技术:
1、开启缓存
要使用smarty缓存,首先开启缓存。先new一个smarty类,然后设置:$tpl = new Smarty();$tpl->caching = true;$tpl->cache_dir = '/cache/tp'
2、设定缓存更新周期
如果缓存永远不更新,那么网站就失去了动态性,下面就要设置一个缓存的更新周期:$tpl->cache_lifetime = 60*60; (以秒为单位)
另外对$tpl->caching要进行设置:
值为1:强迫不更新缓存: 值为2:在获取模板之前设置更新周期 值为0:强制不缓存,相当于false
所以设置更新周期cache_lifetime之前要设置caching = 2
3、一个模板,多个缓存
在缓存文章时,它们都用同一个模板,所以要区分开来。根据display或者fetch的第二个参数来设定:$tpl->display('article.php',$art_id)
4、is_cashed()更合理调用缓存
上面的一些缓存方法,虽然在下次访问页面不用在从数据库更新数据,但是之前的$sql查询数据库的语句还是执行的,这就增加了PHP的处理开销。
在执行$sql语句之前通过is_cached()判断缓存是否存在,例如:
if( is_cached(article.html))
{
$sql = ... //执行一系列$sql语句
}
$tpl->display('article.html');
当这个模板有多个缓存时,可以带上第二个参数:is_cached('article.html',$art_id)
5、局部缓存或者不缓存
我们可以指定缓存页面里的某个部分:
现在smarty的插件目录下顶一个个插件函数:block.cacheless.php,代码如下:
<?php
function smarty_block_cacheless($param, $content, &$smarty)
{
return $content;
}
?>
还要修改smarty里的Smarty _Compiler.class.php,找到下面一行,把true改成false:
$this->_plugins['block'][$tag_command] =array($plugin_func, null, null, null, true)
然后在页面里可以用这个方法指定缓存:
<%$smarty.now%>这里的缓存<cacheless> <br> <%$smarty.now%>这里的不缓存<%/cacheless%>
6、清除缓存
$tpl->clear_all_cache(); //清除所有缓存
$tpl->clear_cache('file.html'); //清除指定的缓存
$tpl->clear_cache('article.html',$art_id); //清除同一个模板下的指定缓存号的缓存
相关文章推荐
- smarty缓存原理讲解(php缓存篇)
- php—Smarty-缓存2(26)
- PHP Smarty 文件缓存(将页面缓存为静态页面)
- php将动态页面缓存为静态html原理
- Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
- atitit.session的原理以及设计 java php实现的异同
- php smarty 缓存
- PHP 伪静态技术原理以及突破原理实现介绍
- PHP 伪静态技术原理以及突破原理实现介绍
- (四)httpd与php-fpm(rpm)的整合以及php缓存加速模块xcache的安装
- TP3.2 字段缓存应用原理 以及 如何开启字段缓存
- php+smarty ,smarty 缓存
- atitit.session的原理以及设计 java php实现的异同
- php smarty模版引擎中的缓存应用
- PHP学习 smarty 的原理
- 关于PHP模板Smarty的初级使用方法以及心得分享
- 分布式缓存Redis使用以及原理
- php 模糊查询数据库的技巧,以及数据分页原理, Date转换
- PHP开发入门 Session原理以及使用
- PHP与Nginx之间的运行机制以及原理