用户
 找回密码
 入住 CI 中国社区
搜索
楼主: spt119
收起左侧

[优化] 使用XML缓存减低数据库的读取次数和服务器压力

  [复制链接]
 楼主| 发表于 2011-6-23 09:05:05 | 显示全部楼层
曾有测试结论PHP操作XML的效果不佳。不知道测试的基础是PHP4还是PHP5,是利用DOM,还是XML对象。
在PHP5条件下,PHP操作XML的速度还是可以接受的,至少在我本地测试环境和实际运行的Linux服务器下,没发现明显的系统拖慢(本例使用XML对象)。而且系统越大,降低的数据库次数越多。当一个程序需要读取20次数据库才能最终显示在客户端浏览器上,如果可以降低10次,意义是不言而喻的。
利用AR开启数据库的缓存也是一个不错的解决方案,但这对于虚拟主机用户来说,有点不现实。
发表于 2011-6-25 08:13:29 | 显示全部楼层
我的方法是把数组生成为指定的文本,这样可以直接调用数组,方法更简单,就是thinkphp里面的"快速缓存"功能,cache(内容, 保存的文件名);   只有一个函数非常的方便,都不用解析XML这一步,函数里是直接
调用文本中的数组取值。
发表于 2011-6-25 10:07:45 | 显示全部楼层
看来各位做cache都深有感触啊...
 楼主| 发表于 2011-6-26 15:52:12 | 显示全部楼层
文本类型的cache,用file_get_content函数读内容,最后转变成关联数组。
xml,则是用simplexml_load_file读取,最后转变成关联数组。
具体到底哪个函数的效率更高,这个还真没测试过。有机会测试一下。
再有,这篇文章的主要思想不是缓存全部的数据库,只是缓存在规定时间内变化不大,或基本不变的表数据缓存。
发表于 2011-7-5 17:09:52 | 显示全部楼层
spt119 发表于 2011-6-26 15:52
文本类型的cache,用file_get_content函数读内容,最后转变成关联数组。
xml,则是用simplexml_load_file读 ...

文本类型的不需要file_get_contents
使用的时候用var_export直接将数组变成文本,file_put_contens进去,使用的时候只需要include以下就可以了
 楼主| 发表于 2011-7-6 12:59:17 | 显示全部楼层
jeongee 发表于 2011-7-5 17:09
文本类型的不需要file_get_contents
使用的时候用var_export直接将数组变成文本,file_put_contens进去, ...

我说用file_get_contents是tp的文本缓存模式。不是泛指都需要这种模式。
还可以直接缓存成后缀名为php的文件保存数组。这主要看缓存的设计目的,而不是都需要一样的模式。
发表于 2011-7-6 13:07:04 | 显示全部楼层
spt119 发表于 2011-7-6 12:59
我说用file_get_contents是tp的文本缓存模式。不是泛指都需要这种模式。
还可以直接缓存成后缀名为php的 ...

啊哦,我也没说都是一样的模式呀
发表于 2011-7-18 11:55:59 | 显示全部楼层
不错的方案,不过我觉得再整理下这就是个更好的文章。

我们撇开性能问题不谈,你这样用XML形式做缓存和以文本形式保存序列化后的数组/对象缓存有本质的区别吗?

从你给的例子里面是没有的,无非是两种不同形式的文本而已。

实际上我们可以利用xml跨平台的特性和xml本身的优势做一些文本和其他类型缓存做不到的事情,比如:

1. 我们可以通过XSLT直接将xml转化和输出成为html网页文件或者其他文本,实现了表现与内容的分离。
2. 在一个异构的系统环境下,我们还可以通过xml作为中间媒介进行数据交换。
 楼主| 发表于 2011-7-26 12:18:27 | 显示全部楼层
本帖最后由 spt119 于 2011-7-26 12:47 编辑

回楼上:
之所以设计成XML,而不是文本形式的序列化数组,主要目的是兼顾AJAX在前端的操作。否则数据库的读取次数是降低了,但频繁的require和include操作,综合来看,也节省不了多少,或者会更多。(没有测试过)
XSLT直接输出成html页的方案,在输出后无须收回的设计方案上是可行的,但如果在html中内嵌统计的话(不是类似51la的统计),程序设计上将会过于复杂,所以没有采用这个方案。
发表于 2011-7-31 12:14:52 | 显示全部楼层
不错 值得借鉴

本版积分规则