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字符串的相互转换, ...
随机推荐
- Koa 框架 的错误处理
默认情况下Koa会将所有错误信息输出到 stderr,除非 NODE_ENV 是 "test".为了实现自定义错误处理逻辑(比如 centralized logging),您可以添 ...
- MySQL几点重要的性能指标计算和优化
qps 每秒处理的查询数tps 每秒处理的事务数IOPS 每秒磁盘进行的I/O操作次数 一.TPS:Transactions Per Second(每秒传输的事物处理个数),即服务器每秒处理的事务数. ...
- 怎么在eclipse中安装svn插件
Subclipse Subclipse is an Eclipse Team Provider plug-in providing support for Subversion within th ...
- 案例:用Redis来存储关注关系
Redis提供了丰富的数据类型,比起关系型数据库或者简单的Key-Value存储(比如Memcached)来,Redis的数据模型与实际应用的数据模型更相近.比如下面说到的好友关系的存储,原作者使用了 ...
- ASP.NET MVC中切换模板页(不同目录的cshtml文件)
看来以后建立一个父类控制器还是有必要的... using System;using System.Collections.Generic;using System.Linq;using System. ...
- Atitit opencv3.0 3.1 3.2 新特性attilax总结
Atitit opencv3.0 3.1 3.2 新特性attilax总结 1. 3.0OpenCV 3 的改动在哪?1 1.1. 模块构成该看哪些模块?2 2. 3.1新特性 2015-12-21 ...
- android 学习视频汇总
1.java基础知识 http://www.eoeandroid.com/thread-333511-1-1.html 网易公开课-抽象编程:http://open.163.com/special/o ...
- github pull request
https://stackoverflow.com/questions/14680711/how-to-do-a-github-pull-request https://help.github.com ...
- Capterra Software Categories
https://www.capterra.com/categories this software categories is valuable.
- 将docker的image转移到数据盘
1. 将 /var/lib/docker 移至数据盘 原因: docker运行中产生较大文件,以及pull下来的images会占用很多空间: 注意:在执行前确认docker已经启动,sudo dock ...