Webman
环境:
workerman/webman-framework 1.5.16
workerman/workerman dev-master (题外话,期待V5发布)
我想在当前请求的时候, 异步统计一些东西(可能有多重操作),所以打算序列化对象,异步消费去处理。
参数较多,所以不想一一拿出来处理 。 比如Request的路由,路由参数,请求参数等。
发现直接调用
1.
serialize(request());
2.
$originReq = clone request();
serialize($originReq);
是会报错的, 如下:
Exception: Serialization of 'Fiber' is not allowed。。
有看到建议在 入队列前,赋值好需要的参数。。
但因为有同步处理时留下的代码,直接依赖了Request,所以想最小化更改并优化。
有没有好的方法,能拿到request对象的序列化,或者转化成字符串后,又能返回到原对象的方法???
demo:
Route::any('/test', function () {
$originReq = clone request();
echo serialize($originReq);
// 这里拿到序列化后的request, 扔进队列。
return '';
})->setParams(['test' => 1]);
$originReq = request();
$newReq = new \support\Request($originReq->rawBuffer());
$newReq->route = $originReq->route;
echo serialize($newReq);
报错:
Exception: Serialization of 'Closure' is not allowed
把这个对象 json成字符串 呢 试试 报错不
json是可以的。 但json后,就没有route关系了, 路由参数拿不到了
'''
"connection":{"id":1,"status":2,"transport":"tcp","getRemoteIp":"127.0.0.1","remotePort":51816,"getRemoteAddress":"127.0.0.1:51816","getLocalIp":"127.0.0.1","getLocalPort":8787,"getLocalAddress":"127.0.0.1:8787","isIpV4":true,"isIpV6":false},"session":null,"properties":[],"plugin":"","app":"","controller":"app\controller\TestController","action":"query","route":{}}
'''
Route的setParams参数
json还是不适合
这种本身好像就不能实现,你请求的对象 放在队列里面 消费者 拿到请求对象 没办法用 队列消费者 是没有这个方法的
就是想给Request做个快照, 类似clone的功能, 然后在队列中唤醒,再调用对象的方法
咋说呢 对象的属性能这么干 但是对象的方法 你咋这么干? 这不现实呀,还不如直接把需要的整队列里面,然后在队列处理呗
“因为有同步处理时留下的代码,直接依赖了Request,所以想最小化更改”。 架不住本来的同步代码已经实现了很多, 我只是优化一下速度用异步,再加上几个功能点。
这 应该是 实现不了吧,这要是实现了 接口不能就彻底异步化了嘛
这也就请求中间件干的事,也不至于同步的业务逻辑异步化。