美文网首页
序列化的使用场景

序列化的使用场景

作者: PENG先森_晓宇 | 来源:发表于2022-04-28 16:49 被阅读0次

    背景

    php中最常用的就是对数组json_encode和json_decode了,在没有json_encode之前,对数组的解析就是使用serialize和unserialize来实现的。由于json_encode效率大于serialize,所以serialize使用的场景也就少了。

    说这么多,来了解下序列化的真实定义:在PHP中,序列化用于存储传递PHP 的值,在序列化->反序列化的过程中,同时不丢失其类型和结构的完整。

    使用场景

    在json_encode代替serialize之后,serialize使用的场景明显少了,但是很多场景仍然必须使用serialize,最常用的就是类的序列化

    mq发送消息

    生产端代码

    1. 先定义一个接口,发送端代码必须实现该接口。该接口的execution()方法用于消费端消费。
    Interface AsyncExecution
    {
        public function execution();
    }
    
    1. 定义发送端代码
    class CheckPlanTrigger  implements AsyncExecution
    {
        protected $method = '';
        protected $params = [];
        
        public function __construct()
        {
        }
        public function execution()
        {
            //TODO
            //耗时的io操作
        }
    }
    $obj = new CheckPlanTrigger();
    $data = [
            'obj' => serialize($obj),
         ];
    return Commit::sendCmdNew(new Cmd(self::CMD, Define::PROXY['sdsroute'], Define::TOPIC['sds_route']), $data, $hashKey, $timestamp);
    

    消费端代码

        public function myExecute($arrInput)
        {
            try {
                $o = unserialize($arrInput['obj']);
                if ($o instanceof \AsyncExecution) {
                    $o->execution();
                } else {
                    // throw new Error(-1,"无法执行异步操作");
                    Log::warning("无法执行异步操作");
                }
            } catch (\Exception $e) {
                throw $e;
            } 
            return true;
        }
    

    通常一些简单的消息可以发送一个json串,下游decode一下就好。如果需要传递的消息是非常复杂,计算量非常耗时时,可以使用上面这种方式,将耗时计算的操作放在下游,这样qps可以瞬间提升。

    使用kafka的目的:解耦,消峰,异步。此例子其实就是异步的实现,提高了qps。

    相关文章

      网友评论

          本文标题:序列化的使用场景

          本文链接:https://www.haomeiwen.com/subject/lonrsrtx.html