PHP数组缓存:三种方式JSON、序列化和var_export的比较
使用PHP的站点系统,在面对大数据量的时候不得不引入缓存机制。有一种简单有效的办法是将PHP的对象缓存到文件里。下面我来对这3种缓存方法进行说明和比较。
第一种方法:JSON
JSON缓存变量的方式主要是使用json_encode和json_decode两个php函数。json_encode可以将变量变成文本格式,这样就可以存到文件里。
使用样例如下:
- // Store cache
- file_put_contents($cachePath, json_encode($myDataArray));
- // Retrieve cache
- $myDataArray = json_decode(file_get_contents($cachePath));
优势:
- 变量序列化后依然可读
- 可以给其他系统使用,因为JSON格式是标准的
劣势:
- 只对UFT-8的数据有效,其他编码可能不能很好工作
- 只对stdClass类的示例有效
第二种方法:序列化
序列化的方式主要使用serialize和unserialize这2个函数,序列化的方式和JSON都是,都是以文本方式存储。
使用示例
- // Store cache
- file_put_contents($cachePath, serialize($myDataArray));
- // Retrieve cache
- $myDataArray = unserialize(file_get_contents($cachePath));
优势:
- 允许非UTF-8的变量
- 支持除了stdClass 示例外的其他实例
劣势:
- 编码后的文本对人来说是不可读的
- 无法被其他语言的系统引用
第三种方法:Var_export
这种方式是用var_export函数将变量内容打印到一个PHP文件里,使用include的方式来重新获取变量内容。因此生成的缓存文件时一个php文件,内容如下
- <?php
- return /*var_export的输出*/;
- ?>
使用示例:
- // Store cache
- file_put_contents($cachePath, "<?php\nreturn " . var_export($myDataArray, true) . ";");
- // Retrieve cache
- $myDataArray = include($cachePath);
优势:
- 对编码格式无要求,允许非UTF-8的编码
- 缓存文件易读
- 获取变量的时候直接使用语言特性,而非函数
- 当使用opcode的时候,缓存php文件会放在opcode的缓存里(这实际上是一个劣势)
劣势:
- 不能缓存不带__set_state 方法的对象
- var_export出来的变量里不能带有影响php语法解析的内容,触发语法错误,可能影响你的php应用
性能测试
是用5组不同大小(904B, ~18kB, ~250kB, ~4.5MB and ~72.5MB)的数组,进行以下测试。
- 使用编码函数对数据进行10次编码
- 计算编码后的数据的大小
- 对编码后的数据进行10次解码
结论
2.53GHz, 4GB, Ubuntu linux, PHP 5.3.0RC4.这样配置的笔记本上,测试的结果如下:


上面2个图表示100%是最佳的,var_export在编码和解码的性能上不佳。建议在数据量小的时候使用序列化的方法,如果数据量非常大,那就要考虑数据结构的问题了。
http://www.opstool.com/article/262
PHP数组缓存:三种方式JSON、序列化和var_export的比较的更多相关文章
- 数组的三种方式总结 多维数组的遍历  Arrays类的常用方法总结
		一.数组的三种声明方式总结 public class WhatEver { public static void main(String[] args) { //第一种 例: String[] tes ... 
- C#初始化数组的三种方式
		C#声明数组并初始化,有三种方式. 对于一维数组: using System;using System.Data;using System.Configuration;using System.Web ... 
- C#三种方式实现序列化(转)
		序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用. 序列化和反序列化最主要的作用有: ... 
- JavaScript中清空数组的三种方式
		方式1,splice ? 1 2 3 var ary = [1,2,3,4]; ary.splice(0,ary.length); console.log(ary); // 输出 [],空数组,即被清 ... 
- Java中遍历数组的三种方式复习
		1 for循环遍历 通常遍历数组都是使用for循环来实现.遍历一维数组很简单,遍历二维数组需要使用双层for循环,通过数组的length属性可获得数组的长度. 程序示例: package captai ... 
- 读取Java文件到byte数组的三种方式
		package zs; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io ... 
- php数组循环的三种方式
		PHP 的遍历数组的三种方式:for循环.foreach循环.while.list().each()组合循环 PHP当中数组分为:索引数组[转换成json是数组]和关联数组[转换成json是对象] f ... 
- C# 对象与JSON字符串互相转换的三种方式
		C# 对象与JSON字符串互相转换的三种方式 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式. 关于内存对象和JSON字符串的相互转换, ... 
- JSON字符串互相转换的三种方式和性能比较
		C# 对象与JSON字符串互相转换的三种方式 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式. 关于内存对象和JSON字符串的相互转换, ... 
随机推荐
- Android build.gradle
			apply plugin: 'com.android.application' android { /*编译版本 , 因此我们强烈推荐总是使用最新的 SDK 进行编译 targetSdkVersion ... 
- iOS上的http请求:get、post以及同步、异步
			1.get: view sourceprint" class="item about" style="color:rgb(51,51,51); text-dec ... 
- 隐藏Tengine的版本信息
			http { ..... server_tokens on; server_info on; server_tag bass; reset_timedout_connection on; keepal ... 
- fpm制做mysql-5.6.33 rpm包
			增加用户: # groupadd -r mysql # useradd -g mysql -r -s /sbin/nologin -M -d /data/my_db mysql 源码安装mysql-5 ... 
- error: unpacking of archive failed on file /usr/sbin/zabbix_agent;592e5bc3: cpio: open
			# lsattr /usr/ ----------I--e- /usr/lib64 ----------I--e- /usr/bin -------------e- /usr/libexec ---- ... 
- Python2.7 fabric理论学习
			在python中有一个可以实现批量管理服务器的工具:fabric,在本地和远程机器上提供了一些基本的操作,并且可以上传/下载文件.执行sudo等功能. 学习环境:ubuntu 12.10+python ... 
- 【Android】Gesture Detector
			Gesture detector Android Touch Screen 与传统Click Touch Screen不同,会有一些手势(Gesture),例如Fling,Scroll等等. 这些Ge ... 
- 显示eclipse中Problem窗口的方法
			https://blog.csdn.net/ningfuxuan/article/details/76395029 ****************************************** ... 
- RestTemplate 发送 get 请求使用误区 多值为null
			http://blog.csdn.net/zhousenshan/article/details/71055687 ****************************************** ... 
- js实现类似微信网页版在可编辑的div中粘贴内容时过滤剪贴板的内容,光标始终在粘贴内容后面,以及将光标定位到最后的方法
			过滤剪贴板内容以及定位可编辑div光标的方法: <!DOCTYPE html><html lang="en"><head> <meta ... 
