zoukankan      html  css  js  c++  java
  • SWOOLE之广播消息实现

    背景:

    使用swoole_server swoole_table实现


    //创建swoole_table
    $table = new swoole_table(1024);
    $table->column('fd', swoole_table::TYPE_INT);
    $table->column('from_id', swoole_table::TYPE_INT);
    $table->column('data', swoole_table::TYPE_STRING, 64);
    $table->create();

    //创建$sev对象,监听9501端口
    $serv = new swoole_server('0.0.0.0', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);

    //设置相关属性
    $serv->set(array(
        'ractor_num'    =>    1,    //主进程中线程数量
        'worker_num'    =>    2,    //工作进程数量
        'daemonize'        =>    0,  //是否守护进程
        'log_file'        =>    '/data/wwwroot/swoole.log',    //日志存储路径
        'dispatch_mode' =>     2,     //1平均分配,2按FD取摸固定分配,3抢占式分配,默认为取模(dispatch=2)'
        'task_worker_num'=> 2,
    ));

    //连接
    $serv->on('connect', function($serv, $fd){
        global $table;
        $fdinfo = $serv->connection_info($fd);
        if (!$table->exist($fd)) {
            $table->set($fd,array('fd'=>$fd,'from_id'=>$fdinfo['from_id'],'data'=>$fdinfo['socket_type']));
        }
    });

    //接收数据
    $serv->on('receive', function($serv, $fd, $from_id, $data){
        if (trim($data)=="sendBroadcast") {
            $task_id = $serv->task('broadcast');
        } else {
            $serv->send($fd, "hello " . $fd . "i am main process " . $serv->master_pid . " and manger id " . $serv->manager_pid);
        }
    });

    //关闭
    $serv->on('close', function($serv, $fd){
        echo $fd . " bye bye!!!";
    });

    //workstart事件
    $serv->on('workerstart', function($serv, $work_id){
        global $argv;
        if($work_id  >= $serv->setting['worker_num']){
            swoole_set_process_name("php {$argv[0]} task worker");
        }else{
            swoole_set_process_name("php {$argv[0]} work worker");
        }
    });

    //server task
    $serv->on('task',function($serv, $taskid, $from_id, $data){
        global $table;
        foreach($table as $row){
            $serv->send($row['fd'],"{$row['fd']} i am broadcast");
        }
        
        $serv->finish("$data -> OK");
    });

    //处理异步任务的结果
    $serv->on('finish', function ($serv, $task_id, $data) {
        echo "AsyncTask[$task_id] Finish: $data".PHP_EOL;
    });
    //启动
    $serv->start();

    PHP中常见的问题点,知识点,及盲点。
  • 相关阅读:
    python全栈学习--day48
    python全栈学习--day47(HTML-----高级选择器与盒子模型等
    python全栈学习--day46(html---列表,标签,表格,表单,css引入与基本选择器)
    python-面向对象编程设计与开发
    python-知识点的复习2
    python-知识点的复习
    python-re模块
    python-logging模块
    python-hash和md5算法
    python-配置文件的处理configpasser模块
  • 原文地址:https://www.cnblogs.com/sblack/p/5512691.html
Copyright © 2011-2022 走看看