webman怎样序列化当前的Request

yskj

问题描述

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]);
[x] 1. json化, 虽然不报错了 ,但是跟实现目标,json数据没任何关系了
[x] 2. 重新创建一个对象, 把路由参数和请求参数放进去, 再序列化.
    $originReq = request();

    $newReq = new \support\Request($originReq->rawBuffer());
    $newReq->route = $originReq->route;
    echo serialize($newReq);

报错:

Exception: Serialization of 'Closure' is not allowed
[ ] 3.todo 今日继续 , 主方向,感觉 2.的方案有搞头,再研究研究。。。
378 1 0
1个回答

tanhongbin

把这个对象 json成字符串 呢 试试 报错不

  • yskj 2024-07-30

    json是可以的。 但json后,就没有route关系了, 路由参数拿不到了

  • yskj 2024-07-30

    '''
    "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参数

  • yskj 2024-07-30

    json还是不适合

  • tanhongbin 2024-07-30

    这种本身好像就不能实现,你请求的对象 放在队列里面 消费者 拿到请求对象 没办法用 队列消费者 是没有这个方法的

  • yskj 2024-07-30

    就是想给Request做个快照, 类似clone的功能, 然后在队列中唤醒,再调用对象的方法

  • tanhongbin 2024-07-30

    咋说呢 对象的属性能这么干 但是对象的方法 你咋这么干? 这不现实呀,还不如直接把需要的整队列里面,然后在队列处理呗

  • yskj 2024-07-30

    “因为有同步处理时留下的代码,直接依赖了Request,所以想最小化更改”。 架不住本来的同步代码已经实现了很多, 我只是优化一下速度用异步,再加上几个功能点。

  • tanhongbin 2024-07-30

    这 应该是 实现不了吧,这要是实现了 接口不能就彻底异步化了嘛

  • yskj 2024-07-30

    这也就请求中间件干的事,也不至于同步的业务逻辑异步化。

×
🔝