请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

为什么加 task 就会报错 找不到 fd

如果把:$data = [
‘task’ => 1,
‘fd’ => $frame->fd,
];
ws−>task(ws->task(ws>task(data);
删除的话 websocket 运行就正常了,但加入task 终端就会报这样的错,麻烦老师看下。

图片描述图片描述

正在回答 回答被采纳积分+3

2回答

提问者 weixin_慕村2369771 2019-01-01 10:43:52
class WS{

    //构建一个构造函数
    CONST HOST ="192.168.33.10";
    CONST PORT =9504;
    public $ws = null;
    public function __construct()
    {
        $this->ws = new swoole_websocket_server(self::HOST,self::PORT);
        /*$this->ws->set([
            'worker_num'     => 8,
            'task_worker_num' => 8,
        ]);*/

        $this->ws->set([
            'worker_num'     => 8,
            'task_worker_num' => 8,
            'enable_static_handler' => true,
            'document_root' => "/vagrant_data/web/singwa",//设置根目录这里根据你自己的路径来写
        ]);

        //监听事件的打开
        $this->ws->on('open',[$this,'onOpen']);
        //onTask
        $this->ws->on('task',[$this,'onMessage']);
        //onFinish 事件
        $this->ws->on('finish',[$this,'onFinish']);
        //监听消息事件
        $this->ws->on('message',[$this,'onMessage']);
        //监听关闭事件
        $this->ws->on('close',[$this,'onClose']);
        $this->ws->start();
    }

    //打开事件
    public function onOpen($ws,$request){
        echo "open connetc {$request->fd}\n";
    }

    //监听消息事件方法:
    public function onMessage($ws,$frame){
        //echo "Receive:".$frame->fd."返回数据信息:".$frame->data."opcode {$frame->opcode}:fin:{$frame->finish}\n";
        echo "返回数据信息:".$frame->data."opcode {$frame->opcode}:fin:{$frame->finish}\n";
        $data = [
            'task' => 1,
            'fd' => $frame->fd,
        ];
        $ws->task($data); //需要接收一个投递任务

        $ws->push($frame->fd,"return connect success返回客户端数据信息6{$frame->data}"); //发送给客户端信息
    }

    //onTask()事件
    public function onTask($serv,$task_id,  $worker_id,  $data){
       // print ($data."task_id{$task_id}\n");
        print ($data);
        //耗时场景 10s
        sleep(10);
        return "on finish work";  //告诉WORKER  请求onFinish方法
    }

    public function onFinish($serv,$task_id,$data){
        echo "onFinish:{$task_id}\n";
        print ("得到的数据是:".$data);    //这里的$data 是 onTask 方法  返回 的信息即   return "on finish work";  值
    }

    //监听关闭事件
    public function onClose($ws,$fd){

        echo "close:{$fd}client\n";
    }

}

$WS = new WS();


0 回复 有任何疑惑可以回复我~
singwa 2019-01-01 08:03:53

同学您好。请把您 完整的  ws_server_nice.php 的代码 贴下,别截图, 晚上的代码复制下,我看看。。。

0 回复 有任何疑惑可以回复我~
  • 提问者 weixin_慕村2369771 #1
    singwa 老师代码帐到上面了。
    回复 有任何疑惑可以回复我~ 2019-01-01 10:45:01
  • 提问者 weixin_慕村2369771 #2
    Swoole\Server::task(): task method can only be used in the worker process.   报这个错,已经 建立了 task() 任务的是 在 swoole_websocket_server 里面建立的。
    回复 有任何疑惑可以回复我~ 2019-01-01 12:35:15
  • 提问者 weixin_慕村2369771 #3
    此问题已经解决: $this->ws->on('task',[$this,'onTask']);
    回复 有任何疑惑可以回复我~ 2019-01-01 13:53:25
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信