tp3集成Workerman

workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP多进程以及libevent事件轮询库

使用tp3框架集成Workerman,需要先把下载的Workerman放到ThinkPHP\Library目录下,把Workerman文件夹下的所有文件加上.class.php后缀,除Workerman\Lib\Constants.php不用修改

这里有已修改好的workerman包可下载

在需要的模块下新建控制器TextController.class.php

reusePort=true)
         */
        $worker->count = 1;
        // worker进程启动后创建一个text Worker以便打开一个内部通讯端口
        $worker->onWorkerStart = function($worker)
        {
            // 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
            $inner_text_worker = new Worker('text://0.0.0.0:9988');
            $inner_text_worker->onMessage = function($connection, $da)
            {
                // $data数组格式,里面有uid,表示向那个uid的页面推送数据
                $data = json_decode($da, true);
                $uid = $data['uid'];
                // 通过workerman,向uid的页面推送数据
                $ret = sendMessageByUid($uid, $da);
                // 返回推送结果
                $connection->send($ret ? 'ok' : 'fail');
            };
            // ## 执行监听 ##
            $inner_text_worker->listen();
        };
        // 新增加一个属性,用来保存uid到connection的映射
        $worker->uidConnections = array();
        // 当有客户端发来消息时执行的回调函数
        $worker->onMessage = function($connection, $data)
        {
            global $worker;
            // 判断当前客户端是否已经验证,既是否设置了uid
            if(!isset($connection->uid))
            {
                // 没验证的话把第一个包当做uid(这里为了方便演示,没做真正的验证)
                $connection->uid = $data;
                /* 保存uid到connection的映射,这样可以方便的通过uid查找connection,
                 * 实现针对特定uid推送数据
                 */
                $worker->uidConnections[$connection->uid] = $connection;
                return;
            }
        };

        // 当有客户端连接断开时
        $worker->onClose = function($connection)
        {
            global $worker;
            if(isset($connection->uid))
            {
                // 连接断开时删除映射
                unset($worker->uidConnections[$connection->uid]);
            }
        };


        // 向所有验证的用户推送数据
        function broadcast($message)
        {
            global $worker;
            foreach($worker->uidConnections as $connection)
            {
                $connection->send($message);
            }
        }

        // 针对uid推送数据

        function sendMessageByUid($uid, $message)
        {
            global $worker;
            if(isset($worker->uidConnections[$uid]))
            {
                $connection = $worker->uidConnections[$uid];
                $connection->send($message);
                return true;
            }
            return false;
        }

        // 运行所有的worker

        Worker::runAll();
    }
}

然后启动监听(CDM),去到项目根目录, 执行 php index.php Mobile/Text

tp3集成Workerman_第1张图片

index.html页面代码





    
    
    
    
    Document


uid:
data:

tp3集成Workerman_第2张图片

随便一个控制器定义一个方法调用 推送成功会输出ok

// 测试
    public function workerman(){
        $uid = $_POST['uid']; // 传过来的客户端ID或者你自己的用户ID
        // 建立socket连接到内部推送端口
        $client = stream_socket_client('tcp://127.0.0.1:9988', $errno, $errmsg, 1);
        // 推送的数据,包含uid字段,表示是给这个uid推送
        $data = array('uid'=>$uid, 'percent'=>'1');
        // 发送数据,注意端口是Text协议的端口,Text协议需要在数据末尾加上换行符
        fwrite($client, json_encode($data)."\n");
        // 读取推送结果
        echo fread($client, 8192);
    }

tp3集成Workerman_第3张图片

tp3集成Workerman_第4张图片

你可能感兴趣的:(thinkphp,html,php,php,html,workerman)