thinkphp如何调用workman传值

dpdzq

案例描述:

我要用thinkphp做一个接口,供第三方调用传过来数据,我这边拿到数据后需要通过websocket直接连接通讯服务器,所以,我只需要workerman作为客户端使用,不需要作为server端。现在的问题是thinkphp接口拿到的数据,如何传入workerman的客户端内

不胜感激

阅读 410
3个回答

不败少龙

为啥不是workerman里面调用thinkphp里面接口数据

  • dpdzq 2021-05-28

    因为并不知道第三方什么时候调用api,第三方调用了api传了数据,就需要将数据通过websocket传到websocket server去,整个过程没有web页面,只是接口或后台的处理

  • 不败少龙 2021-05-28

    那你发送数据到websocket server服务里面 在服务里面处理传过来的值的时候 调用接口数据并处理

  • 不败少龙 2021-05-28

    onMessage里面去做处理第三方的接口

  • dpdzq 2021-05-28

    第三方只能调用restful接口,但是websocket server只提供websocket,无法提供其他协议的接口

  • dpdzq 2021-05-28

    @8039:所以我必须在中间再架一层,提供restful接口给第三方用,拿到数据通过websocket传给websocket server

  • dpdzq 2021-05-28

    我单独用workerman作为客户端跑,连接websocket server没有问题,tp写接口也可以,现在就是不知道tp接口拿到的数据如何传入workerman客户端。或者大佬们有其他的实现方式也可以,再次感谢

  • 不败少龙 2021-05-28

    那很前端获取到接口数据直接send给websocket server

  • 不败少龙 2021-05-28

    不过你可以贴一下代码 按照我的理解是刚刚说的那样去做

  • dpdzq 2021-05-28

    @4519:直接send给websocket server倒是可以,但这样就不是长连接了,用一次连一次的话,太频繁了

  • 不败少龙 2021-05-28

    你是用的gateway吗?
    $data['demo'] = 1233;
    call_user_func([\app\service\common\EventServer\EventServer::class,'demo'],$data);
    接收的值在onMessage里面的类型里面去处理

  • 不败少龙 2021-05-28

    是用一个程序框架里面的时候

  • dpdzq 2021-05-28

    没有用到gateway,查了下,网上都说的是gateway做server,gatewayclient与gateway通讯,好像也不太符合

dpdzq

workerman作为客户端的代码如下:

require_once DIR . '/../../vendor/workerman/workerman/Autoloader.php';
require_once DIR . '/../../extend/proto/GPBMetadata/Message.php';

use \Workerman\Worker;
use \Workerman\Connection\AsyncTcpConnection;

$task = new \Workerman\Worker();
$task->onWorkerStart = function ($task) {
// 不支持直接指定http,但是可以用tcp模拟http协议发送数据
$connection = new \Workerman\Connection\AsyncTcpConnection('ws://xxx.xxx.xxx.xxx:1234');

// 当连接建立成功时,发送http请求数据
$connection->onConnect = function ($connection) {
    $token = "token";
    $user = "user";

    $login_data = login($token, $user);
    $connection->send($login_data);
};

$connection->onMessage = function ($connection, $http_buffer) {
    echo $http_buffer;
};

$connection->onClose = function ($connection) {
    echo "connection closed\n";
};

$connection->onError = function ($connection, $code, $msg) {
    echo "Error code:$code msg:$msg\n";
};

$connection->connect();

};

// 运行worker
Worker::runAll();

上面单独的这个客户端代码我在服务器上已经调通了

tp的接口我还没有写,现在就是不知道tp写的api拿到的输入如何传入这个workderman的客户端程序里面

dpdzq

网上说的都是在server的worker里面再创建一个worker,text协议,但是这个是在websocket的server里面,现在我的worker是个client

  • dpdzq 2021-06-29

    这个问题已经搞定,确实也可以在这个作为客户端的worker里面再创建一个text worker监听api传过来的数据