yonghu.php 4.9 KB
<?php
require_once __DIR__ . '/simplewind/vendor/autoload.php';
require_once __DIR__ . '/simplewind/vendor/workerman/workerman/Autoloader.php';

use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
use think\Db;
use Workerman\Lib\Timer;
//
//$worker = new Worker('websocket://0.0.0.0:1234');
//$worker->count = 1;
//// worker进程启动后创建一个text Worker以便打开一个内部通讯端口
//$worker->onWorkerStart = function($worker)
//{
//    // 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
//    $inner_text_worker = new Worker('text://0.0.0.0:5678');
//    $inner_text_worker->onMessage = function($connection, $buffer)
//    {
//        // $data数组格式,里面有uid,表示向那个uid的页面推送数据
//        $data = json_decode($buffer, true);
//        $uid = $data['uid'];
//        // 通过workerman,向uid的页面推送数据
//        $ret = sendMessageByUid($uid, $buffer);
//        // 返回推送结果
//        $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;
//}
// 数据库配置信息设置(全局有效)
//Db::setConfig(['数据库配置参数(数组)']);

////创建一个监听端口
//$worker = new Worker("websocket://114.215.223.17:5001");
////设置当前Worker实例的名称
//$worker->name='panhaowen';
//// 启动1个进程对外提供服务
//$worker->count = 1;



//// 进程启动时设置一个定时器,定时向所有客户端连接发送数据
//$worker->onWorkerStart = function($worker)
//{
//    // 定时,每10秒一次
//    Timer::add(10, function()use($worker)
//    {
//        // 遍历当前进程所有的客户端连接,发送当前服务器的时间
//        foreach($worker->connections as $connection)
//        {
//            $connection->send(time());
//        }
//    });
//};





//$worker->onConnect = function($connection)
//{
//    echo "new connection from ip " . $connection->getRemoteIp() . "\n";
//};







//$worker->onWorkerStart = function($worker)
//{
//    // 将db实例存储在全局变量中(也可以存储在某类的静态成员中)
//    global $db;
//    $db = new \Workerman\MySQL\Connection('rm-m5eblhc9o3515i25neo.mysql.rds.aliyuncs.com', '3306', 'db136s1ehvo1yn73', 'cxz307311SJK', 'fupai');
//};




//// 当客户端发来数据时
//$worker->onMessage = function($connection, $data) {
//    global $db;
//    $data=$db->select('create_time')->from('fp_user')->where("id=1")->query();
//};



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


$worker = new Worker();

$worker->onWorkerStart = function($worker){
    // 设置访问对方主机的本地ip及端口(每个socket连接都会占用一个本地端口)
    $context_option = array(
        'socket' => array(
            // ip必须是本机网卡ip,并且能访问对方主机,否则无效
            'bindto' => '114.215.223.17:5002',
        ),
    );

    $con = new AsyncTcpConnection('ws://114.215.223.17:5001', $context_option);

    $con->onConnect = function($con) {
        $con->send('hello');
    };

    $con->onMessage = function($con, $data) {
        echo $data;
    };

    $con->connect();
};





Worker::runAll();