(留意,本文引自fzzwake 的 PHP文件缓存效率测试一文,并对测试代码做了修改。)
PHP文件缓存内容保存格式主要有三种:
- 变量 var_export 格式化成PHP正常的赋值书写格式,用的时候直接include文件
- 变量 serialize 序列化之后保存,用的时候反序列化
- 变量 json_encode格式化之后保存,用的时候json_decode
一直以来,我都以为第一种效率最高,因为那是PHP脚本解释器解析PHP脚本的格式,原生的,应该最快,至少读取缓存的效率应该是最高的,可是今天做了个测试,令我大跌眼镜!原来 serialize序列化效率才是最高的,不论是读还是写!
下面是用来测试的PHP代码:
<?php /** * PHP文件缓存效率测试 * @author fzzwake * @version 在 fzzwake 的基础上做了修改 * @see http://blog.csdn.net/fzzwake/article/details/2714975 */ $path = 'data/'; // 定义写入测试目录 $max = 100; // 定义写入测试文件数 $result = ARRAY(); date_default_timezone_set('Asia/Chongqing'); // 设置时区 $result['start'] = date('Y-m-d H:i:s'); // 记录开始时间 /* serialize 测试写入 */ $se_start = microtime(1); for ($i=0; $i<$max; $i++) { $file = file_put_contents($path.'se'.$i.'.php', serialize($_SERVER)); } $result['se_write'] = microtime(1) - $se_start; /* serialize 测试读取 */ $se_start = microtime(1); $file = ''; for ($i=0; $i<$max; $i++){ $file = file_get_contents($path.'se'.$i.'.php'); $file = unserialize($file); } $result['se_read'] = microtime(1) - $se_start; /* var_export 测试写入 */ $file = '<?php $a = '.var_export($_SERVER, TRUE)." ?>"; $in_start = microtime(1); for ($i=0; $i<$max; $i++) { file_put_contents($path.'in'.$i.'.php',$file); } $result['in_write'] = microtime(1) - $in_start; /* var_export 测试读取 */ $in_start = microtime(1); for ($i=0; $i<$max; $i++) { $file = include($path.'in'.$i.'.php'); } $result['in_read'] = microtime(1) - $in_start; /* json 测试写入 */ $file = json_encode($_SERVER); $js_start = microtime(1); for ($i=0; $i<$max; $i++) { file_put_contents($path.'js'.$i.'.php', $file); } $result['js_write'] = microtime(1) - $js_start; /* json 测试读取 */ $js_start = microtime(1); for ($i=0; $i<$max; $i++) { $file = file_get_contents($path.'js'.$i.'.php'); $file = json_decode($file); } $result['js_read'] = microtime(1) - $js_start; $result['end'] = date('Y-m-d H:i:s'); // 记录结束时间 echo <<<EOT <table border=1 width="50%"> <tr><td colspan="3">start time : {$result['start']}</td></tr> <tr><td>name</td><td>read time</td><td>write time</td></tr> <tr><td>serialize</td><td>{$result['se_read']}</td><td>{$result['se_write']}</td</tr> <tr><td>var_export</td><td>{$result['in_read']}</td><td>{$result['in_write']}</td></tr> <tr><td>json</td><td>{$result['js_read']}</td><td>{$result['js_write']}</td></tr> <tr><td colspan="3">end time : {$result['end']}</td></tr> EOT; ?>
序列化是最快,无论读或写,都是第一种的效率的两倍,json比序列化效率稍低,表现还可以!
如果撇开文件读写所耗费的时间,他们的效率差别可能会更大!
include那个,虽然是PHP脚本赋值的格式,但是也是要分析解析文本,PHP脚本解释器需要动用整个解释器分析PHP脚本,而序列化不需要,只用启用序列化文本分析就行了,所以效率更高。
PS:最后,别忘了在命令行下删除测试生成的文件:del * /Q(在 Windows中)。
引自:fzzwake 的 PHP文件缓存效率测试(测试代码有修改)