序列化的使用场景

背景

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。

你可能感兴趣的:(序列化的使用场景)