(留意,本文引自fzzwakePHP文件缓存效率测试一文,并对测试代码做了修改。)

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中)。

引自:fzzwakePHP文件缓存效率测试(测试代码有修改)