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字符串的相互转换, ...
随机推荐
- 让Redis在你的系统中发挥更大作用
Redis在很多方面与其他数据库解决方案不同:它使用内存提供主存储支持,而仅使用硬盘做持久性的存储:它的数据模型非常独特,用的是单线程.另一个大区别在于,你可以在开发环境中使用Redis的功能,但却不 ...
- photoshop,钢笔工具锚点类型
以下是钢笔工具绘制出的三种类型的锚点,分别是:无切线的硬锚点.左右切线平行的锚点.左右切线不平行的锚点. 使用转换点工具点击锚点,可以实现 无切线锚点 和 左右切线平行的锚点 之间的转化: 对 左右切 ...
- 在 Unity 中基于 Oculus DK1 的开发
开发环境: Windows 10 专业版 64位(GeForce GTX 970M,驱动版本:378.72) 大朋助手 1.3.2.10,大朋E2(http://www.deepoon.com/dap ...
- virtualbox和vagrant卸载脚本在macbook
virtualbox和vagrant在macbook版本的安装文件内,都有一个卸载脚本uninstall.tool vagrant2.1.5卸载脚本: #!/usr/bin/env bash #--- ...
- Tsk4.5异步
public async void LoadData<T>(WhereClip where,OrderByClip order) where T : Entity, new() { try ...
- Lua官方文档与源码分析
https://www.lua.org/source/5.3/ http://www.cppblog.com/airtrack/archive/2012/09/19/191233.html https ...
- PHP网站环境搭配: Apache Http+PHP+Mysql
Apache Http+PHP+Mysql 环境搭配 1. 先下载上述三个软件 都要下载对应系统的软件,mysql还可以再下载navicat for mysql. 2. 安装Apache Http ...
- 每日英语:Singles Day in China
Singles Day in China is the celebration -- or mourning -- of being unattached. Started by students i ...
- ny24 素数距离的问题 筛选法求素数
素数距离问题时间限制:3000 ms | 内存限制:65535 KB难度:2 描述 现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度.如果左右有等距离长度素 ...
- 自定义 Django的User Model,扩展 AbstractUser类注意事项
本篇主要讨论一下User Model的使用技巧. 注意, 由于Django 1.5之后user model带来了很大的变化, 本篇内容只针对django 1.5之后的版本. 1. 确定 User Mo ...