PHP文件缓存的性能测试
前言:
在开发MooPHP的过程中,为了寻找更为高效的缓存方式,对两种最常用的缓存方式进行了测试。
PHP常用缓存方式:
第一种,把需要缓存的数据进行处理,形成PHP可以直接执行的文件。在需要缓存数据的时候,通过include方式引入,并使用。
第二种,把需要的数据通过serialize函数序列化后直接保存到文件。在需要使用缓存数据的时候,通过反序列化读入文件内容并复制给需要的变量,然后使用。
测试结果:
通过测试我们发现,第二种也就是serialize缓存数据的方式更加高效。(数据略去,最后提供了文章地址下载,大家可以自行测试)
原因分析:
include方式读取缓存的时候,PHP需要执行几个过程
1.读取文件
2.解析所Include的文件
3.执行,给变量赋值
而serialize序列化方式读取缓存的时候:
1.读取数据
2.反序列化数据内容
3.给变量赋值
从以上内容对比的话,可能是由于解析PHP文件内的数组需要的时间超过unserialize反序列化数组的时间。如果你有兴趣可以查看《PHP filesystem相关函数和include require的性能效率研究》:http://www.ccvita.com/163.html
测试文件代码:
下载地址:MooPHP-CacheTest.zip
原创地址:http://www.ccvita.com/311.html 有新的研究心得会在这里更新。
CacheTest_IncludeFile.php
$t1 = gettimeofday();
for ($i = 0; $i < 10000; $i++){
include("CacheTest_IncludeData.php");
}
$t2 = gettimeofday();
echo ($t2['sec'] - $t1['sec']) * 1000 + ($t2['usec'] - $t1['usec']) / 1000 . "\n";
CacheTest_SerializeFile.php
function read_cache($filename) {
if(@$fp = fopen($filename, 'r')) {
@$data = fread($fp,filesize($cachefile));
fclose($fp);
}
return $s;
}
$t1 = gettimeofday();
for ($i = 0; $i < 10000; $i++){
$x = read_cache("CacheTest_SerializeData.php");
$x_r = unserialize($x);
}
$t2 = gettimeofday();
echo ($t2['sec'] - $t1['sec']) * 1000 + ($t2['usec'] - $t1['usec']) / 1000 . "\n";
总结分析:
第一种,include缓存的方式
优点:增加数据的保密性,和安全性,缓存内容不会被外界发现。
缺点:速度相对较慢。
用途:保存禁止系统外部得知的数据,比如web系统的设置,甚至MySQL信息等的保存
第二种,serialize序列化缓存的方式
优点:速度较快。
缺点:缓存系统文件路径一旦曝光,缓存内容会泄露。
用途:缓存最新文章,相关文章等不担心外部得知的数据的时候,可以使用这种方式。
备注:
当装了ea、apc等PHP内存缓存之后,第一种通过include读取缓存的方式速度会高于第二种serialize序列化缓存的方式。所以在MooPHP框架中,我们对于非敏感信息采用第二种方式缓存;敏感信息采用第一种方式缓存。有关MooPHP的介绍可以参考《MooPHP框架简介》这篇文章(地址:http://www.ccvita.com/295.html)
所以在MooPHP框架中,我们对于非敏感信息采用第一种方式缓存;敏感信息采用第二种方式缓存。
反了吧
发现你越来越牛了~
@习明 果然反了,已经修改啦
@blankyao 没事多研究嘛
用memcache应该比上述两种方式都要好。缓存在内存里读起来总要比硬盘快吧~
可惜memcache这东东 还不太完善 不支持内存对象的遍历操作 不能支持复杂的查询。。。等完善了就是个很强大的东西~
@Tommy 从通用程序的角度考虑,文件缓存还是有存在的必要的。但是自己做项目的话,条件允许的情况下,用Memcache还是很好的。
to kimi:只读不写,强力推荐Memcache,但它在互动的时候就有问题了,比如并发写memcache,就容易丢,而且把内容放在memcache太长时间容易出问题。文件缓存还是需要的。比较推荐cache_lite
用serialize/unserialize也可以缓存私密数据
缓存的文件名用*.php,缓存内容要修改一下,变成一个数组,数组的第一个元素是字符串”",第二个元素是要缓存的数据,然后把这个数据serialize之后保存到php文件中
@adu, 这个方法是可以行的,但是性能上不如直接导入文件。
汗,发不了代码?
数组的第一个元素是一段PHP代码的字符串
PHP占位符 exit(’Access denied’); PHP结束符
缓存系统文件路径一点曝光,缓存内容会泄露怎么理解?可以解释一下吗?
谢谢
什么意思啊?缓存文件在哪里?
@海角, 下载那个演示的PHP脚本就可以看到了
其实serialize同样可以做到缓存内容不泄露
方法为:
1、缓存文件内容前面有“”(不含双引号,下同)
2、缓存文件后缀为.php
3、file_put_contents读取缓存内容后,str_replace掉“”
自己所写的文件缓存类就是这么做的。
现在在研究单文件缓存secache,不知道博主有没有什么想法~
@horseluke, 呃….那双引号的内容似乎被过滤掉了。就是一段php代码,里面直接调用exit函数~
如果在一个循环中,用serialize保存数据会不会太慢啊!
回复留言
水水语录
树上趴个大马猴,大马猴不给我鸟蛋
最新日志
分类列表
文章归档
关键词
Apache 媳妇 配置 感慨 PHP技术 MySQL Memcache 优化 PHP类 css PHP 迪拜 陈陈 调优 Linux 生活 MySQL优化 FireFox Discuz! Nginx 缓存 性能 Rewrite MooPHP框架 JavaScript WordPress插件 WordPress MySQL效率 风骚 生日 奇矩互动 负载 视频 blog程序 IE6 分析 yy 高负载 ZIP IE7 服务器 正则表达式 常用 防盗链 Cookie
Copyright © 2010 平凡的世界 Themes Design by 平凡的世界. Base on justintadlock.com.
Powered by WordPress. 19 queries. 0.173 seconds.