使用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

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

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

    一.数组的三种声明方式总结 public class WhatEver { public static void main(String[] args) { //第一种 例: String[] tes ...

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

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

  3. C#三种方式实现序列化(转)

    序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用. 序列化和反序列化最主要的作用有: ...

  4. JavaScript中清空数组的三种方式

    方式1,splice ? 1 2 3 var ary = [1,2,3,4]; ary.splice(0,ary.length); console.log(ary); // 输出 [],空数组,即被清 ...

  5. Java中遍历数组的三种方式复习

    1 for循环遍历 通常遍历数组都是使用for循环来实现.遍历一维数组很简单,遍历二维数组需要使用双层for循环,通过数组的length属性可获得数组的长度. 程序示例: package captai ...

  6. 读取Java文件到byte数组的三种方式

    package zs; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io ...

  7. php数组循环的三种方式

    PHP 的遍历数组的三种方式:for循环.foreach循环.while.list().each()组合循环 PHP当中数组分为:索引数组[转换成json是数组]和关联数组[转换成json是对象] f ...

  8. C# 对象与JSON字符串互相转换的三种方式

    C# 对象与JSON字符串互相转换的三种方式 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式. 关于内存对象和JSON字符串的相互转换, ...

  9. JSON字符串互相转换的三种方式和性能比较

    C# 对象与JSON字符串互相转换的三种方式 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式. 关于内存对象和JSON字符串的相互转换, ...

随机推荐

  1. Koa 框架 的错误处理

    默认情况下Koa会将所有错误信息输出到 stderr,除非 NODE_ENV 是 "test".为了实现自定义错误处理逻辑(比如 centralized logging),您可以添 ...

  2. MySQL几点重要的性能指标计算和优化

    qps 每秒处理的查询数tps 每秒处理的事务数IOPS 每秒磁盘进行的I/O操作次数 一.TPS:Transactions Per Second(每秒传输的事物处理个数),即服务器每秒处理的事务数. ...

  3. 怎么在eclipse中安装svn插件

    Subclipse   Subclipse is an Eclipse Team Provider plug-in providing support for Subversion within th ...

  4. 案例:用Redis来存储关注关系

    Redis提供了丰富的数据类型,比起关系型数据库或者简单的Key-Value存储(比如Memcached)来,Redis的数据模型与实际应用的数据模型更相近.比如下面说到的好友关系的存储,原作者使用了 ...

  5. ASP.NET MVC中切换模板页(不同目录的cshtml文件)

    看来以后建立一个父类控制器还是有必要的... using System;using System.Collections.Generic;using System.Linq;using System. ...

  6. 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 ...

  7. android 学习视频汇总

    1.java基础知识 http://www.eoeandroid.com/thread-333511-1-1.html 网易公开课-抽象编程:http://open.163.com/special/o ...

  8. github pull request

    https://stackoverflow.com/questions/14680711/how-to-do-a-github-pull-request https://help.github.com ...

  9. Capterra Software Categories

    https://www.capterra.com/categories this software categories is valuable.

  10. 将docker的image转移到数据盘

    1. 将 /var/lib/docker 移至数据盘 原因: docker运行中产生较大文件,以及pull下来的images会占用很多空间: 注意:在执行前确认docker已经启动,sudo dock ...