PHP数组缓存:三种方式JSON、序列化和var_export的比较

使用PHP的站点系统,在面对大数据量的时候不得不引入缓存机制。有一种简单有效的办法是将PHP的对象缓存到文件里。下面我来对这3种缓存方法进行说明和比较。

第一种方法:JSON
JSON缓存变量的方式主要是使用json_encode和json_decode两个php函数。json_encode可以将变量变成文本格式,这样就可以存到文件里。
使用样例如下:

  1. // Store cache
  2. file_put_contents($cachePath, json_encode($myDataArray));
  3. // Retrieve cache
  4. $myDataArray = json_decode(file_get_contents($cachePath));

优势:

  • 变量序列化后依然可读
  • 可以给其他系统使用,因为JSON格式是标准的

劣势:

  • 只对UFT-8的数据有效,其他编码可能不能很好工作
  • 只对stdClass类的示例有效

第二种方法:序列化
序列化的方式主要使用serialize和unserialize这2个函数,序列化的方式和JSON都是,都是以文本方式存储。
使用示例

  1. // Store cache
  2. file_put_contents($cachePath, serialize($myDataArray));
  3. // Retrieve cache
  4. $myDataArray = unserialize(file_get_contents($cachePath));

优势:

  • 允许非UTF-8的变量
  • 支持除了stdClass 示例外的其他实例

劣势:

  • 编码后的文本对人来说是不可读的
  • 无法被其他语言的系统引用

第三种方法:Var_export
这种方式是用var_export函数将变量内容打印到一个PHP文件里,使用include的方式来重新获取变量内容。因此生成的缓存文件时一个php文件,内容如下

  1. <?php
  2. return /*var_export的输出*/;
  3. ?>

使用示例:

  1. // Store cache
  2. file_put_contents($cachePath, "<?php\nreturn " . var_export($myDataArray, true) . ";");
  3. // Retrieve cache
  4. $myDataArray = include($cachePath);

优势:

  • 对编码格式无要求,允许非UTF-8的编码
  • 缓存文件易读
  • 获取变量的时候直接使用语言特性,而非函数
  • 当使用opcode的时候,缓存php文件会放在opcode的缓存里(这实际上是一个劣势)

劣势:

  • 不能缓存不带__set_state 方法的对象
  • var_export出来的变量里不能带有影响php语法解析的内容,触发语法错误,可能影响你的php应用

性能测试
是用5组不同大小(904B, ~18kB, ~250kB, ~4.5MB and ~72.5MB)的数组,进行以下测试。

  1. 使用编码函数对数据进行10次编码
  2. 计算编码后的数据的大小
  3. 对编码后的数据进行10次解码

结论
2.53GHz, 4GB, Ubuntu linux, PHP 5.3.0RC4.这样配置的笔记本上,测试的结果如下:



上面2个图表示100%是最佳的,var_export在编码和解码的性能上不佳。建议在数据量小的时候使用序列化的方法,如果数据量非常大,那就要考虑数据结构的问题了。

http://www.opstool.com/article/262

时间: 2024-08-05 15:25:48

PHP数组缓存:三种方式JSON、序列化和var_export的比较的相关文章

清空数组的三种方式

清空数组的三种方式: 1.splice(0,数组的长度): var arr1 = arr.splice(0,arr.length); console.log(arr1); 2.让数组的长度为0: 这种方式很有意思,其它语言如Java,其数组的length是只读的,不能被赋值.如   int[] ary = {1,2,3,4}; ary.length = 0; Java中会报错,编译通不过.而JS中则可以,且将数组清空了; (在JS中length的属性是可读可写的,也就是可以给length属性赋值

JavaScript定义数组的三种方式(new Array(),new Array(&#39;x&#39;,&#39;y&#39;),[&#39;x&#39;,&#39;y&#39;])

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

数组的三种方式总结、 多维数组的遍历及 Arrays类的常用方法总结

一.数组的三种方式总结 1.创建数组 Java语言使用new操作符来创建数组,语法如下: arrayRefVar = new dataType[arraySize]; 上面的语法语句做了两件事: 一.使用 dataType[arraySize] 创建了一个数组. 二.把新创建的数组的引用赋值给变量 arrayRefVar. 数组变量的声明,和创建数组可以用一条语句完成,如下所示: dataType[] arrayRefVar = new dataType[arraySize]; 另外,你还可以使

C#初始化数组的三种方式

C#声明数组并初始化,有三种方式. 对于一维数组: using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlContro

JavaScript中清空数组的三种方式

方式1,splice 1 2 3 var ary = [1,2,3,4]; ary.splice(0,ary.length); console.log(ary); // 输出 Array[0],空数组,即被清空了 方式2,length赋值为0 这种方式很有意思,其它语言如Java,其数组的length是只读的,不能被赋值.如 1 2 int[] ary = {1,2,3,4}; ary.length = 0; Java中会报错,编译通不过.而JS中则可以,且将数组清空了, 1 2 3 var a

1、打印二进制机器码,程序内存分析,大端序小端序,指针数组,数组指针,数组的三种访问方式,typedef,#if-0-#endif,求数组大小,括号表达式

 1.打印二进制机器码(分别表示32位的和64位的) #include <stdio.h> /*按照8位的长度打印一个数值*/ void dis8bit(char val) { int bit = 8; while(bit--) { if(1<<bit&val){ printf("1"); } else { printf("0"); } if(!(bit%4)) printf(" "); } putchar(1

数组的三种定义方式

// 数组的三种定义方式 var arr = ['zhangsan','lisi','wangwu']; var arr1 = new Array('zhangsan','lisi','wangwu'); var arr2 = new Array(3); arr2[0] = 'zhangsan'; //注意:下标一定要写,不像在php中,下标是可以不写,是一直追加 // console.log(arr2); // 说明:js中,没有关联数组一说,数组下标都是数字 // 如果一个数组的下标是自定义

SpringMVC返回json数据的三种方式

SpringMVC返回json数据的三种方式:http://blog.csdn.net/shan9liang/article/details/42181345 上述第三种方法:可能会出现这个jar包没有的情况,引入即可,下面pom引入即可 java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/JsonProcessingException

OC-NSArray数组的三种遍历方式

// // main.m // 818-数组遍历三种方式 // // Created by 邱学伟 on 15/8/18. // Copyright (c) 2015年 邱学伟. All rights reserved. // #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSArray *ary = @[@(10),@"lovke"