项目需要使用异步Http组件,在回调中向客户端返回数据,问如何先挂起连接不断开,然后手动发送数据
我也比较好奇这个问题怎样处理才是最合适的,我们之前系统的处理思路是,第一个请求过来先把请求参数入到队列,然后给客户端返回一个队列id(自定义生成,跟队列任务进行绑定),客户端收到队列id后定时来调用户获取队列结果的接口来取队列消费结果。服务器这边开启redis-queue服务消费队列,消费成功后将结果保存在以队列id为key的缓存中。
你可以看看这里的讨论,https://www.workerman.net/q/8685
webman现在没有解决方案,walkor看到修复一下,手机回复这个编辑器打一个字换一行,体验极差。
回复出来了就没有了,输入的时候打个字编辑器里字就自动往下跳一行。
我刚刚再测了一下,输入英语没问题 ,中文或者符号都会往下跳。
editor.md的bug,没找到哪里问题
目前建议使用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。
composer require revolt/event-loop
config/server.php
'event_loop' => Workerman\Events\Revolt::class
revolt/event-loop
使用fiber协程的好处就是可以暂停代码及恢复执行,实现用同步的方式写异步代码。缺点是要做全局变量隔离,比如request()这些函数没办法在协程里使用了。
到时候,最好能搞一个“总开关”一键开启/关闭协程, 比如说不需要使用协程可以不开启,这种! ^_^
开启/关闭
之后这么改是默认还是一个进程在同一时间接受1个http请求,在上面这种通过fiber让出控制权的场景会变成同时保持多个http连接吧。
感谢大佬解答,看样子又得去学习新东西了
就是说webman,以后支持协程了呀,老大牛逼,爱你摸摸咂
这就很Good,以后就是fiberman了
我也比较好奇这个问题怎样处理才是最合适的,我们之前系统的处理思路是,第一个请求过来先把请求参数入到队列,然后给客户端返回一个队列id(自定义生成,跟队列任务进行绑定),客户端收到队列id后定时来调用户获取队列结果的接口来取队列消费结果。服务器这边开启redis-queue服务消费队列,消费成功后将结果保存在以队列id为key的缓存中。
你可以看看这里的讨论,https://www.workerman.net/q/8685
webman现在没有解决方案,walkor看到修复一下,手机回复这个编辑器打一个字换一行,体验极差。
回复出来了就没有了,输入的时候打个字编辑器里字就自动往下跳一行。
我刚刚再测了一下,输入英语没问题 ,中文或者符号都会往下跳。
editor.md的bug,没找到哪里问题
目前建议使用webman自定义进程去做挂连接。
后面workerman v5 配合fiber协程可以做到让webman挂起当前请求,代码类似这样。
app/functions.php
app/controller/Index.php
需要 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()这些函数没办法在协程里使用了。
到时候,最好能搞一个“总开关”一键
开启/关闭
协程,比如说不需要使用协程可以不开启,这种! ^_^
之后这么改是默认还是一个进程在同一时间接受1个http请求,在上面这种通过fiber让出控制权的场景会变成同时保持多个http连接吧。
感谢大佬解答,看样子又得去学习新东西了
就是说webman,以后支持协程了呀,老大牛逼,爱你摸摸咂
这就很Good,以后就是fiberman了