Maison  >  Article  >  développement back-end  >  关于smarty+php开发时,缓存的一点想法与讨论可行性。xuzuning版主来看看

关于smarty+php开发时,缓存的一点想法与讨论可行性。xuzuning版主来看看

WBOY
WBOYoriginal
2016-06-23 13:41:09957parcourir

我自已用PHP+SMARTY开发一个程序。 本来当时用SMARTY的时候,就知道SMARTY有缓存的功能。但是当时没去了解。以为等程序开发完成了 最后弄缓存。。可是现在开发完了,开始研究SMARTY缓存。发现smarty的缓存 根本不适合我(可能是我没研究透彻?)  
首先说一下,smarty一但开启缓存  功能后,就证明所有页面都开始了缓存,, 而我的程序 90%的功能 都是即时性的。不需要缓存

只有10%的功能。如: 友情链接   网站信息  BANNER 这些10年都不用改一次的信息 需要缓存起来。省得每次都查询表。

而SMARTY的局部缓存功能  肯定不适合我去用。总不能 让这90%的功能 都写成一个不缓存标签 去调用吧?
百度一下过后   千篇一律,  肯定没有解决方法(可能是我没研究明白)


后来 又开始研究 PHP的缓存技术。。。发现PHP 不能像ASP一样 利用IIS application来缓存  

除了安装第三方软件外。。大多数 都是文件缓存。。。。。。。。那么问题来了,,,我突然产生了一个奇怪的想法。

即然 SMARTY和PHP 都是利用文件缓存的方式。。为什么我不自已写一个,,。。 方法如下:

function web(){ 
相关SQL查询 组成数组
}
$smarty->assign('web',web());
$smarty->display("web.html");
这是smarty正常的解析   。。。那我们可不可以这样

function web(){ 
if(当缓存文件不存在){
执行SQL查询
生成一个TXT文档  并把查询的数组放在里面(第一次 当缓存文件不存在时)
}elseif (第二次  这里就发现了缓存文件){
return 打开TXT文档 并读取文档中的数组;

$smarty->assign('web',web());
$smarty->display("web.html");

}

这是我想到的办法,,  我感觉 PHP读取TXT的速度 肯定 比读取数据库的速度要快  对不对。

在不考虑安全性的情况下
1.这样做 是否可行?
2.在数据量大的时候,会不会影响PHP性能(重要)
3.还有没有更好的办法
4.SMARTY 可不可以指定缓存对像。。其它都不缓存。


请大家讨论一下。给我个答案吧。


回复讨论(解决方案)

1、PHP读取TXT的速度 肯定 比读取数据库的速度要快
     这个感觉准确吗?因为实际上并不是单纯的读,还要有其他行管的操作,比如检查文件是否存在,检查文件是否太旧了.....
2、如果文件缓存的是查询结果,那么 mysql 提供的 SQL_CACHE 子句是否比自己操纵缓存文件效率更高些呢?
3、如果有10年都不用改一次的信息,那么为何不直接做成静态文件 include 进来呢?
4、你描述的方法与 smarty 的如出一辙,当然 smarty 的代码显然要比你的多。但那又是为什么呢?很简单,smarty 经过多年的实战,他那部分代码能处理你没遇到过的、你没想到的复杂情况。当你的项目经过一段时间运行以后,缓存控制部分的代码也会一样的胖起来的
5、如果你考虑使用第三方内存操作软件来缓存数据到内存的话,那么是否也应该考虑使用 mysql 的内存表呢?至少不需要改变原有代码就可象操作表一样操作内存了
6、如果你的运行环境是 unix 兼容系统,是否也可考虑 mount 基于内存的文件系统呢

总之提高效率并没有一成不变的方法,而各种元素的组合的最佳点是需要实验才能得到的

1、PHP读取TXT的速度 肯定 比读取数据库的速度要快
     这个感觉准确吗?因为实际上并不是单纯的读,还要有其他行管的操作,比如检查文件是否存在,检查文件是否太旧了.....
2、如果文件缓存的是查询结果,那么 mysql 提供的 SQL_CACHE 子句是否比自己操纵缓存文件效率更高些呢?
3、如果有10年都不用改一次的信息,那么为何不直接做成静态文件 include 进来呢?
4、你描述的方法与 smarty 的如出一辙,当然 smarty 的代码显然要比你的多。但那又是为什么呢?很简单,smarty 经过多年的实战,他那部分代码能处理你没遇到过的、你没想到的复杂情况。当你的项目经过一段时间运行以后,缓存控制部分的代码也会一样的胖起来的
5、如果你考虑使用第三方内存操作软件来缓存数据到内存的话,那么是否也应该考虑使用 mysql 的内存表呢?至少不需要改变原有代码就可象操作表一样操作内存了
6、如果你的运行环境是 unix 兼容系统,是否也可考虑 mount 基于内存的文件系统呢

总之提高效率并没有一成不变的方法,而各种元素的组合的最佳点是需要实验才能得到的




1.只需要判断txt是否存在即可。不需要判断时间。。因为用户如果修改了最新的数据。。可以让他清理一下缓存(就是删除老的TXT文件)
2.无法保存成html这样的静态文件,因为我的想法是 把数组保存在TXT中  到时候 还是要读取出来 用smarty 标签{list}中间循环p这个数组的{/list}
3.我现在就研究一下 SQL_CACHE 子句和mysql 的内存表  我是PHP新手。呵呵  从ASP转过来的

谢谢版主啊

smarty缓存是针对文件,不可以限制哪些地方不使用缓存,即某些页面不开启缓存,如果量很大,建议使用内存缓存。

1.内存表或 memcache
2.文件形式

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn