LD 写过一个 DsCache, 当然, 现在集成在新框架中, 嘿嘿, 还是自己写的东…西…好用!

言归正传, 之前 QeePHP 论坛里曾出过这么一个传言, 那就是 phpdatafile 缓存方式速度极快, 老大还说, ta几乎可以和 xcache 匹敌. 于是 LD 杀到 qee 的svn中, look 一点源码. 其实所谓 phpdatafile, 关键在于 var_export , 那么普通php 文件缓存呢? serialize. 简单改写后, 测试了下. 大跌眼镜.

下面是 var_export 和 serialize 两种方式的速度差异(100W次):

Windows XP(xampp 1.7.1 – AMD Athlon(tm) II X2 240 Processor 2.8GHz, 1.75GB Mem) 下结果:
datafile ext Time: 768.691594839
serialfile ext Time: 377.889446974

RHEL, Linux 2.6.18-8.el5xen i386(Apache/2.2.3 (Unix) PHP/5.2.9 – AMD Athlon(tm) 64 X2 Dual Core Processor 3600+ 1.9GHz, 0.9GB Mem) 下结果:
datafile ext Time: 255.446233988
serialfile ext Time: 121.841640949

1. 代码文件

 1 <?php
 2 /**
 3  * PHP文件缓存(通过序列化存储, 支持对象缓存)
 4  *   时间判断使用 int filemtime  ( string $filename  )
 5  *
 6  * @filesource serialfile.class.php
 7  * @package peck
 8  * @subpackage _cache
 9  * @version $id: 0.1, utf8, Tue Jan 26 14:02:27 CST 2010
10  * @author LD King <kldscs[at]gmail.com>
11  * @copyright Copyleft (D.) 2007 – 2009 MiFunny China Inc.
12  * @link http://mifunny.info/
13  * @example
14  *  …
15  */
16 class serialfile extends _DsCache{
17     
18     /**
19      * 写入缓存
20      *   缓存时间为0, 永不过期
21      *
22      * @param string $id 缓存唯一标识ID
23      * @param mixed $data 缓存内容
24      * @param mixed $expiration 缓存时间,默认 int 900
25      */
26     public function set($id, $data, $expiration=null){
27         $path = $this->_path($id);
28         file_put_contents($path, ‘<?php die(); ?>.serialize($data), LOCK_EX);
29         clearstatcache();
30         return true;
31     }
32     
33     /**
34      * 读取缓存,失败或缓存撒失效时返回 false
35      *
36      * @param string $id 缓存唯一标识ID
37      * @param array $policy 配置数组
38      *
39      * @return mixed
40      */
41     public function get($id, $expiration=null){
42         $life_time = is_null($expiration) ? $this->_default_policy['life_time'] : $expiration;
43         $path = $this->_path($id);
44
45         if( is_file($path) ){
46             if( $life_time==0 OR
47               (time()-filemtime($path))<=$life_time ){
48                 return unserialize( file_get_contents($path,NULL,NULL,15) );  
49             }else
50                 return false;
51         }else
52             return false;
53     }
54     
55 }//END class seriafile
56 ?>