我用webman做了一个接口函数,接口函数会等待ws服务器的数据,根据解析的服务数据在返回数据,请问接口函数怎么做等待处理

lianggan

我用webman做了一个接口函数,接口函数会等待ws服务器的数据,根据解析的服务数据在返回数据,请问接口函数怎么做等待处理

1002 1 2
1个回答

walkor

异步这种直接用webman自定义进程处理简单些。
新建 process/Api.php

<?php
namespace process;

use Workerman\Protocols\Http\Request;
use Workerman\Connection\AsyncTcpConnection;

class Api
{
    public function onMessage($connection, Request $request)
    {
        $device_id = $request->get('device_id');
        $ws = new AsyncTcpConnection('ws://127.0.0.1:2022');
        $ws->onMessage = function ($ws, $data) use ($connection) {
            $connection->send($data);
            $ws->close();
        };
        $ws->onConnect = function ($ws) use ($device_id) {
            $ws->send($device_id);
        };
        $ws->connect();
    }
}

config/process.php中增加配置

return [
    //   这里省略了其它配置....

    'api' => [
        'handler' => \process\Api::class,
        'listen'  => 'http://0.0.0.0:1234',
    ]
];

重启webman后访问 http://127.0.0.1:1234/?device_id=1

可以在接口前增加一层nginx代理,用80或者443统一对外提供服务,方便一些。

  • lianggan 2022-02-24

    @walkor 我按照你上面的方法建立好后,调用http://127.0.0.1:1234/?device_id=1没反应。

  • walkor 2022-02-24

    你的需求不是在ws响应后才返回http响应么?响应是在ws返回数据后响应的。你把ws调用改成你实际的ws调用。

    $ws->onMessage = function ($ws, $data) use ($connection) {
         // 这里发送响应
         $connection->send($data);
         $ws->close();
    };
  • lianggan 2022-02-24

    谢谢大佬,我刚才的测试工具没弄对,你写的例子是对的,测试没问题。

  • lianggan 2022-07-27

    大佬,此例程每次new AsyncTcpConnection('ws://127.0.0.1:2022');接受到数据就关闭,开始没问题,次数多了,发现会很慢,能不能让new AsyncTcpConnection('ws://127.0.0.1:2022');一直开起,不关闭。

年代过于久远,无法发表回答
🔝