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 = 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日

原文地址:https://www.cnblogs.com/sochishun/p/7462177.html