zoukankan      html  css  js  c++  java
  • 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日

  • 相关阅读:
    NOIP模拟赛 篮球比赛1
    class对象详解
    github如何搜索资料
    c# double 类型保留几位小数
    php项目执行composer install时报错
    承载地图的div如果隐藏再显示,则定位时会定位到页面左上角
    标题过长,用省略号显示
    跳转页面带参数
    日期和时间戳转换
    秒数转换为时分秒
  • 原文地址:https://www.cnblogs.com/sochishun/p/7462177.html
Copyright © 2011-2022 走看看