PHP常用缓存方式:
第一种,把需要缓存的数据进行处理,形成PHP可以直接执行的文件。在需要缓存数据的时候,通过include方式引入,并使用。
第二种,把需要的数据通过serialize函数序列化后直接保存到文件。在需要使用缓存数据的时候,通过反序列化读入文件内容并复制给需要的变量,然后使用。

测试结果:
通过测试我们发现,第二种也就是serialize缓存数据的方式更加高效。(数据略去,最后提供了文章地址下载,大家可以自行测试)

原因分析:
include方式读取缓存的时候,PHP需要执行几个过程
1.读取文件
2.解析所Include的文件
3.执行,给变量赋值

而serialize序列化方式读取缓存的时候:
1.读取数据
2.反序列化数据内容
3.给变量赋值

总结分析:
第一种,include缓存的方式
优点:增加数据的保密性,和安全性,缓存内容不会被外界发现。
缺点:速度相对较慢。
用途:保存禁止系统外部得知的数据,比如web系统的设置,甚至MySQL信息等的保存

第二种,serialize序列化缓存的方式
优点:速度较快,可处理除了resource之外的任何类型,特别是对象的存储,这是其存在的意义(json_encode()无法处理对象方法等数据)。
缺点:缓存系统文件路径一旦曝光,缓存内容会泄露。
用途:缓存最新文章,相关文章等不担心外部得知的数据的时候,可以使用这种方式。

PHP文件缓存内容保存格式主要有三种:

(1)变量 var_export 格式化成PHP正常的赋值书写格式;
(2)变量 serialize 序列化之后保存,用的时候反序列化;
(3)变量 json_encode格式化之后保存,用的时候json_decode;

互联网上测试结果是:serialize格式的文件解析效率大于Json,Json的解析效率大于PHP正常赋值。
所以我们要是缓存数据建议采用序列化的形式解析数据会更快。

注意:json只有四种类型,并且是以简单的符号表示,而serialize有更加详细的类型区分。 json无法处理对象方法等数据,因此序列化对象要用serialize()。

与对象无关的数据存储可以使用json,如包含大量数字的数组等,而对象的存储要用serialize,这是其存在的意义。

serialize()可处理除了resource之外的任何类型。

$data=[];
for($i=1;$i<10;$i++){
$data[]=['id'=>$i,'title'=>'title '.$i];
}
$redis = new Redis();
$redis->connect('127.0.0.1');
$redis->set('data', serialize($data)); // 使用serialize序列化数据为字符串
$data2 = unserialize($redis->get('data')); // 反序列化字符串为数据
var_export($data2);

resource类型的资源只能用$GLOBALS缓存

class dbutil {
protected $link = null;
public function connect($host, $user, $password, $database = '') {
$this->link = mysqli_connect($host, $user, $password, $database, 3306);
}
public function query($sqlstmt) {
$result = $this->link->query($sqlstmt);
$out = [];
while ($row = mysqli_fetch_row($result)) {
$out[] = $row;
}
return $out;
}
} $dbutil = new dbutil();
$dbutil->connect('127.0.0.1', 'root', 'root', 'chaoyue');
$list = $dbutil->query('select * from fanwe_user limit 1');
var_export($list);
echo '<hr />'; //$GLOBALS['db']=$dbutil; // $GLOBALS普通赋值方法
$GLOBALS += ['db2' => $dbutil]; // $GLOBALS另一种赋值方法
$list2 = $GLOBALS['db2']->query('select * from fanwe_user limit 1');
var_export($list2);
exit;

参考文章:
php apc缓存以及与redis的对比 (http://blog.csdn.net/w18704622664/article/details/47132061)
Redis数据存储解决方案 (http://www.cnblogs.com/fvsfvs123/p/4319240.html)
Redis 与 数据库处理数据的两种模式 (http://www.veryhuo.com/a/view/9266.html)
Redis内存使用优化与存储 (http://www.infoq.com/cn/articles/tq-redis-memory-usage-optimization-storage)
Redis复制与可扩展集群搭建 (http://www.infoq.com/cn/articles/tq-redis-copy-build-scalable-cluster)
redis缓存队列+MySQL +php任务脚本定时批量入库 (http://www.cnblogs.com/shijy-1990/p/5920841.html)
PHP读取大文件 (http://www.cnblogs.com/DavidYan/articles/2496235.html)
让php读取文件不在受内存限制 (http://www.71j.cn/archives/88)
PHP中文件缓存转内存缓存的方法 (http://www.jb51.net/article/29068.htm)
PHP 文件缓存的性能测试 (http://www.jb51.net/article/23206.htm)
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC) (http://www.jb51.net/article/88281.htm)
PHP文件缓存内容保存格式实例分析 (http://www.jb51.net/article/54046.htm)
PHP5+引进$GLOBALS延迟初始化的概念 (http://blog.csdn.net/billfeller/article/details/8517746)
$GLOBALS与global区别 & 变量销毁机制 (http://blog.csdn.net/u013372487/article/details/72085692)
Redis 命令参考 (http://redisdoc.com/)

版权声明:本文采用署名-非商业性使用-相同方式共享(CC BY-NC-SA 3.0 CN)国际许可协议进行许可,转载请注明作者及出处。
本文标题:PHP使用serialize和json_encode序列化数据并通过redis缓存文件和$GLOGALS缓存资源对象
本文链接:http://www.cnblogs.com/sochishun/p/7462177.html
本文作者:SoChishun (邮箱:14507247#qq.com | 博客:http://www.cnblogs.com/sochishun/)
发表日期:2017年9月1日

PHP使用serialize和json_encode序列化数据并通过redis缓存文件和$GLOGALS缓存资源对象的更多相关文章

  1. PHP的serialize序列化数据与JSON格式化数据

    serialize序列化 我们在一些老的WEB系统中可能会看到在数据库或在文本文件中存储着一大串貌似有着特殊含义的字符串文本内容.我们仔细看会发现它具有数据类型和结构等信息,但是它并不容易人工阅读,它 ...

  2. PHP多种序列化/反序列化的方法 serialize,json_encode等

    序列化是将变量转换为可保存或传输的字符串的过程:反序列化就是在适当的时候把这个字符串再转化成原来的变量使用.这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性. 1.  serialize ...

  3. jQuery ajax - serialize() 方法-输出序列化表单值

    定义和用法 serialize() 方法通过序列化表单值,创建 URL 编码文本字符串. 您可以选择一个或多个表单元素(比如 input 及/或 文本框),或者 form 元素本身. 序列化的值可在生 ...

  4. igbinary vs serialize vs json_encode

    igbinary vs serialize vs json_encode 2010-04-18 @ 23:01:58 · 作者 Volcano · 归类于 php 你可能会感兴趣的内容 关于" ...

  5. form表单序列化数据之后,追加额外数据

    form表单序列化数据之后追加额外数据多使用在js中,下面是追加额外数据的代码: <span style="font-size:18px;">$.param({'inv ...

  6. php总结7——文件函数库、序列化数据、文件包含

    7.1 文件函数库 php用来操作文件的 1) fopen    代开文件或URL 格式:resource fopen(string $filename, string $mode) 'r' 只读方式 ...

  7. 使用所见即所得文本编辑器编辑文本存入数据库后通过ajax获取服务器json_encode的数据到前台,文本内容上边的html标签不解析

    使用所见即所得文本编辑器编辑文本存入数据库后通过ajax获取服务器json_encode的数据到前台,文本内容上边的html标签不解析 因为我在前台使用了jquery的text()方法,而不是html ...

  8. 2016 系统设计第一期 (档案一)jQuery ajax serialize()方法form提交数据

    jQuery ajax serialize()方法form提交数据,有个很奇怪的问题,好像不能取到隐藏控件的值. //点击提交按钮保存数据 $('#btn_submitUser').click(fun ...

  9. 基于QTcpSocket和QTcpServer的Tcp通讯以及QDataStream序列化数据

    最近要在QT下开发Tcp通讯,发送序列化数据以便于接收. 这里涉及到几个问题: 1.QTcpSocket.QTcpServer的通讯 2.QDataStream序列化数据 多的不说,直接上干货!!! ...

随机推荐

  1. 大数据入门第十四天——Hbase详解(二)基本概念与命令、javaAPI

    一.hbase数据模型 完整的官方文档的翻译,参考:https://www.cnblogs.com/simple-focus/p/6198329.html 1.rowkey 与nosql数据库们一样, ...

  2. WPF XML序列化保存数据 支持Datagrid 显示/编辑/添加/删除数据

    XML序列化保存数据 using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...

  3. 2017-2018-2 20155203《网络对抗技术》 Exp8:Web基础

    基础问题回答 (1)什么是表单 我认为,form概念主要区分于table,table是用网页布局设计,是静态的,form是用于显示和收集信息传递到服务器和后台数据库中,是动态的: 以下是表单的百度百科 ...

  4. Python、pywin32&pycharm安装记录

    未完待续-- Python 下载安装 1.百度搜索Python,进入官网,download,下载相应版本 [因为我们需要用到的是Windows下的解释器,所以在Operating System中可以选 ...

  5. Struts2将图片输出到页面

            在做CRUD的过程中,添加页面是个表单,表单里面有一项是上传头像文件.这样表单提交后,头像文件上传了. 但这个文件存的地址是本地硬盘的一个文件夹.在编辑页面要做这个头像的回显的话,就需 ...

  6. [清华集训2015 Day1]玛里苟斯-[线性基]

    Description Solution 考虑k=1的情况.假设所有数中,第i位为1的数的个数为x,则最后所有的子集异或结果中,第i位为1的个数为$(C_{k}^{1}+C_{k}^{3}+...)$ ...

  7. python 回溯法 子集树模板 系列 —— 16、爬楼梯

    问题 某楼梯有n层台阶,每步只能走1级台阶,或2级台阶.从下向上爬楼梯,有多少种爬法? 分析 这个问题之前用分治法解决过.但是,这里我要用回溯法子集树模板解决它. 祭出元素-状态空间分析大法:每一步是 ...

  8. 使用fddb的测试工具测试自己的检测器

    本文是在linux下测试的,首先编译,并安装gnuplot 按照程序给定,将文件放置到对应的文件夹下 #runEvaluate.pl # where gnuplot ismy $GNUPLOT = & ...

  9. allegro 基本步骤

    PCB 1.建立电路板 首先是打开PCB编辑器——开始--所有程序-- Allegro SPB 15.5--PCB Editor,在弹出的对话框中选择Allegro PCB Design 610(PC ...

  10. 前端开发工具icestar

    前端开发工具icestar 最近忙里偷闲,把之前的mock工具进行了全面的重构,最大的改变就是换了个名称icestar,icestar意思就是"爱死他",首先他的预想并不只是替代m ...