用AsyncTcpConnection向服务器发送指令,获取服务器返回的数据。

workerofmine

在cmd下执行 php test.php,可以正常收发数据。
但指令是由用户发送,所以要用PHP写个接口获取用户的指令,然后运行workerman返回指令对应的数据。
想请教下接口获取用户发来的指令后,怎么运行workerman?

4252 10 0
10个回答

walkor

workerman是命令行启动的,不能通过网页启动。

你可以监听一个http协议的端口,$this->worker->onMessage 里接收到客户端http请求后new AsncTcpConnection去请求远程数据。然后命令行启动这个http服务。

  • 暂无评论
workerofmine

监听一个http协议的端口,是先new一个woker,然后在这个worker的onMessage 中再new AsncTcpConnection,这个我之前试过了,报错说window下不支持同时实例化多个worker,是这样吗?

  • 暂无评论
walkor

你__construct源码里

$this->worker = new Worker();
改成
$this->worker = new Worker('http://0.0.0.0:8585');
$this->worker->onMessage = array($this, 'onMessage');

然后给Bases写一个onMessage方法。

  • 暂无评论
workerofmine

是这个意思吗,onMessage里面写什么内容,跟start方法怎么关联?

 public function __construct($url,$base,$orderArr = []){
        $this -> url        = $url;
        $this -> base       = $base;
        $this -> orderArr   = $orderArr;

        $this->worker       = new Worker('http://0.0.0.0:8585');
        $this->worker->onMessage = array($this, 'onMessage');
        $this -> worker -> name  = 'normal';

        $this -> start();

    }

    public function onMessage(){
        //这里面写什么内容?
    }

    public function start(){
        $this -> worker -> onWorkerStart = function(){
            $con              = new AsyncTcpConnection($this -> url);
            //其他代码
        } 
  }
  • 暂无评论
walkor

onMessage的内容就是start的内容。start方法可以去掉了

  • 暂无评论
workerofmine

onMessage 不需要参数吧,我现在直接实例化传参,然后命令行运行test.php,一点反应都没有。

  • 暂无评论
walkor

onMessage用法去看手册吧。。。

  • 暂无评论
workerofmine

突然又感觉懵了,我是这样理解的,您给看看理解得对不对。
要想实现我说的功能,就得在onMessage里面使用AsyncTcpConnection才行。
但onMessage的作用是当Workerman收到数据时才触发。
所以是不是需要再写一个onConnect,用来接收用户发送的指令发给服务器。
这样在AsyncTcpConnection的onConnect中就不需要发送指令到服务器,只需在onMessage里面获取服务器返回的数据,然后进行数据库操作就行了。
是这个意思吗?

或者说不需要再写onConnect,还是在AsyncTcpConnection的onConnect中向服务器发指令,在onMessage中获取返回的数据?

  • 暂无评论
workerofmine

如果不需要再写onConnect,还是在AsyncTcpConnection的onConnect中向服务器发指令,在onMessage中获取返回的数据,这样写对吗?


    public function __construct($url,$base,$orderArr = []){
        $this -> url = $url;
        $this -> base = $base;
        $this -> orderArr = $orderArr;

        $this -> worker = new Worker('http://0.0.0.0:8585');
        $this -> worker -> onMessage = array($this,'onMessage');
        $this -> worker -> name = 'normal';
        $this-> onMessage();   //是这样触发onMessage方法?
    }

    public function onMessage(){

        $this -> worker -> onMessage = function(){     //是onMessage还是onWorkerStart
            $con = new AsyncTcpConnection($this -> url);
            $con -> onConnect = function($con){
                //拼接、发送指令
            };
            $con -> onMessage = function($con,$returnDatas){
                //获取服务器返回的数据,进行数据库操作
            };
        };
        Worker ::runAll();
 }
  • 暂无评论
workerofmine

我按照上面的方法试了,还是和之前接口返回的一样,请求超时,是哪没理解写错了吗,我总感觉快写出来了,麻烦您再指点一下吧。

  • 暂无评论
年代过于久远,无法发表回答
🔝