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

来源:4-10 Swoole task任务使用(上)

weixin_慕村2369771

2019-01-01

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

图片描述图片描述

写回答

2回答

weixin_慕村2369771

提问者

2019-01-01

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
0

singwa

2019-01-01

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

0
4
singwa
回复
weixin_慕村2369771
赞这位同学,解决了就好。祝您学习愉快, 新年快乐。。。
2019-01-01
共4条回复

Swoole入门到实战打造高性能赛事直播平台

swoole创始人推荐,借助Swoole打造高性能直播平台

2228 学习 · 1062 问题

查看课程