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. Fiddler无法抓取某些APP的HTTPS请求,无解!!!

    遇到有些APP的HTTPS请求无法抓取!错误提示: !SecureClientPipeDirect failed: System.Security.Authentication.Authenticat ...

  2. 20155226 《网络攻防》 Exp1 PC平台逆向破解(5)M

    20155226 <网络攻防> Exp1 PC平台逆向破解(5)M 实践目标 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串 该程序同时包含另一个代 ...

  3. vue-cli,build 后,报错的解决办法

    报错如下图: 或: 解决办法:config / index.js 中,找到 build { assetsPublicPath: '/' },将其设置为:assetsPublicPath: './ ' ...

  4. MFC CTreeCtrl运用

    CTreeCtrl运用 删除无效资源 递归的运用 自写遍历目录函数 递归遍历所有子目录 一.删除无效资源 .打开资源文件 .找到无效链接删掉 二.自写遍历目录函数 CFileFind findfile ...

  5. 委托、多播委托(MulticastDelegate)

    委托.多播委托(MulticastDelegate) 多播委托(MulticastDelegate)继承自 Delegate ,表示多路广播委托:即,其调用列表中可以拥有多个元素的委托.实际上,我们自 ...

  6. 前端示例MVC网站

    前端示例MVC网站 ASP.NET Zero 包含了一个公共web站点的前端页面和一个登陆页面.当您第一次运行项目的时候可以看到,如下图所示: 该前端网站有两个页面,一个是主页和关于我们.这些页面的内 ...

  7. HyperLedger Fabric 学习思路分享

    HyperLedger Fabric 学习思路分享 HyperLedger Fabric最初是由Digital Asset和IBM公司贡献的.由Linux基金会主办的一个超级账本项目,它是一个目前非常 ...

  8. UI Recorder 安装教程(一)

    前言: UI Recorder 是一款零成本UI自动化录制工具,类似于Selenium IDE. UI Recorder 要比Selenium IDE更加强大! UI Recorder 非常简单易用. ...

  9. JS高级程序设计学习笔记1

    javascript产生的原因: 在拨号上网时代,表单数据必须发送到服务器端才能验证输入值得有效性,JavaScript的研发就是为了解决这个问题,以便在客户端就验证输入值的有效性. ECMAScri ...

  10. 每日scrum(6)

    今天是小组正式冲刺的第六天,软件的各种结尾工作,还有一些模块就已经全部实现了: 遇到的问题主要是对于自己能力的担忧,以前总是想,如果自己努力,就会怎样成功,其实并不是那样,小小的距离就是很远的能力差距 ...