背景
php中最常用的就是对数组json_encode和json_decode了,在没有json_encode之前,对数组的解析就是使用serialize和unserialize来实现的。由于json_encode效率大于serialize,所以serialize使用的场景也就少了。
说这么多,来了解下序列化的真实定义:在PHP中,序列化用于存储
或传递
PHP 的值,在序列化->反序列化的过程中,同时不丢失其类型和结构
的完整。
使用场景
在json_encode代替serialize之后,serialize使用的场景明显少了,但是很多场景仍然必须使用serialize,最常用的就是类的序列化
。
mq发送消息
生产端代码
- 先定义一个接口,发送端代码必须实现该接口。该接口的execution()方法用于消费端消费。
Interface AsyncExecution
{
public function execution();
}
- 定义发送端代码
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。
网友评论