php serialize mysql_PHP使用serialize和json_encode序列化数据并通过redis缓存文件和$GLOGALS缓存资源对象...

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 = newRedis();$redis->connect('127.0.0.1');$redis->set('data', serialize($data)); //使用serialize序列化数据为字符串

$data2 = unserialize($redis->get('data')); //反序列化字符串为数据

var_export($data2);

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

classdbutil {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 = newdbutil();$dbutil->connect('127.0.0.1', 'root', 'root', 'chaoyue');$list = $dbutil->query('select * from fanwe_user limit 1');var_export($list);echo '


';//$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日

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值