webman如何挂起客户端连接

Hanmo

项目需要使用异步Http组件,在回调中向客户端返回数据,问如何先挂起连接不断开,然后手动发送数据

256 4 3
4个回答

luojianqun

我也比较好奇这个问题怎样处理才是最合适的,我们之前系统的处理思路是,第一个请求过来先把请求参数入到队列,然后给客户端返回一个队列id(自定义生成,跟队列任务进行绑定),客户端收到队列id后定时来调用户获取队列结果的接口来取队列消费结果。服务器这边开启redis-queue服务消费队列,消费成功后将结果保存在以队列id为key的缓存中。

  • 暂无评论
小阳光

你可以看看这里的讨论,https://www.workerman.net/q/8685

  • 暂无评论
2548a

webman现在没有解决方案,walkor看到修复一下,手机回复这个编辑器打一个字换一行,体验极差。

  • 2548a 5天前

    回复出来了就没有了,输入的时候打个字编辑器里字就自动往下跳一行。

  • 2548a 5天前

    我刚刚再测了一下,输入英语没问题 ,中文或者符号都会往下跳。

  • walkor 5天前

    editor.md的bug,没找到哪里问题

walkor

目前建议使用webman自定义进程去做挂连接。

后面workerman v5 配合fiber协程可以做到让webman挂起当前请求,代码类似这样。

app/functions.php

<?php
use Workerman\Worker;

function get($url) {
    $http = new Workerman\Http\Client();
    $event_loop = Worker::getEventLoop()->driver();
    $suspension = $event_loop->getSuspension();
    $http->get($url, function($response) use ($suspension){
        return $suspension->resume((string)$response->getBody());
    });
    return $suspension->suspend();
}

app/controller/Index.php

<?php
namespace app\controller;
use support\Request;

class Index
{
    public function index(Request $request)
    {
        return get('http://example.com');
    }
}

需要 php >= 8.1, 安装 composer require revolt/event-loop,设置 config/server.php'event_loop' => Workerman\Events\Revolt::class
workerman v5还没有发布,workerman v5需要等待revolt/event-loop发稳定版本。
webman目前composer 依赖的仍然是 v4,无法直接安装v5。

使用fiber协程的好处就是可以暂停代码及恢复执行,实现用同步的方式写异步代码。缺点是要做全局变量隔离,比如request()这些函数没办法在协程里使用了。

  • liziyu 5天前

    到时候,最好能搞一个“总开关”一键开启/关闭协程,
    比如说不需要使用协程可以不开启,这种! ^_^

  • 缝合 5天前

    之后这么改是默认还是一个进程在同一时间接受1个http请求,在上面这种通过fiber让出控制权的场景会变成同时保持多个http连接吧。

  • Hanmo 3天前

    感谢大佬解答,看样子又得去学习新东西了

🔝