PHP使用GatewayWorker完成即时通讯

GatewayWorker2.x 3.x完成即时通讯
框架tp5.1
官方介绍文档
官方地址下载
PHP使用GatewayWorker完成即时通讯_第1张图片
直接下载zip 压缩包就可以
PHP使用GatewayWorker完成即时通讯_第2张图片
放在服务器上 不一定是自己程序里 我放在啦vendor文件夹下
PHP使用GatewayWorker完成即时通讯_第3张图片
首先 修改 start_gateway.php中的 // gateway 进程
PHP使用GatewayWorker完成即时通讯_第4张图片
修改为$gateway = new Gateway("websocket://0.0.0.0:1026 "); 后面的端口 就是通讯的端口必须保证是打开的状态

启动程序
/www/wwwroot/jzlm.99fuku.com/vendor/GatewayWorker 文件夹先打开宝塔终端 去执行这些命令

PHP使用GatewayWorker完成即时通讯_第5张图片

Events.php 文件就是逻辑层 基本上所有的处理都在这里面
此文件里包含绑定平台uid
推送指定uid 信息
以及类型信息的不同处理


/**
 * This file is part of workerman.
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the MIT-LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @author walkor
 * @copyright walkor
 * @link http://www.workerman.net/
 * @license http://www.opensource.org/licenses/mit-license.php MIT License
 */

/**
 * 用于检测业务代码死循环或者长时间阻塞等问题
 * 如果发现业务卡死,可以将下面declare打开(去掉//注释),并执行php start.php reload
 * 然后观察一段时间workerman.log看是否有process_timeout异常
 */
//declare(ticks=1);

use \GatewayWorker\Lib\Gateway;

/**
 * 主逻辑
 * 主要是处理 onConnect onMessage onClose 三个方法
 * onConnect 和 onClose 如果不需要可以不用实现并删除
 */
class Events
{
     
    /**
     * 当客户端连接时触发
     * 如果业务不需此回调可以删除onConnect
     * 
     * @param int $client_id 连接id
     */
    public static function onConnect($client_id)
    {
     
        global $num;
        echo "connect".++$num.":".$client_id."\n";
        //发送让用户绑定id
       Gateway::sendToClient($client_id,json_encode(['type'=>'init','client_id'=>$client_id]));
        // 向当前client_id发送数据 
        // Gateway::sendToClient($client_id,"Hello 欢迎使用");
        // // 向所有人发送
        // Gateway::sendToAll("欢迎使用");
        
        // 向当前client_id发送数据
        // Gateway::sendToClient($client_id, "Hello $client_id\r\n");
        // // 向所有人发送
        // Gateway::sendToAll("$client_id login\r\n");
    }
    
   /**
    * 当客户端发来消息时触发
    * @param int $client_id 连接id
    * @param mixed $message 具体消息
    */
   public static function onMessage($client_id, $message)
   {
     
        // 向所有人发送 
        // Gateway::sendToAll("$client_id said $message\r\n");
        
        //   Gateway::sendToAll("$message\r\n");
        
        $message_data = json_decode($message,true);
        if(!$message_data){
     
           return;
       }
       switch($message_data['type']){
     
           case "bind":
               $uid = $message_data['uid'];
               Gateway::bindUid($client_id, $uid);
               return;
            case "notarize":
                $uid = $message_data['uid'];
                $toid = $message_data['toid'];
                $contract_id = $message_data['contract_id'];

               $date=[
                   'type'=>'notarize',
                   'contract_id'=>$contract_id,
                   'uid'=>$uid,
                   'toid'=>$toid,
                   'time'=>date('Y-m-d H:i:s',time())
               ];
            if(Gateway::isUidOnline($toid)){
     //是否在线
                $date['isread']= 1;
                   Gateway::sendToUid($toid, json_encode($date));
               }else{
     
                   $date['isread']=0;
               }
               $date['type']="save";
               Gateway::sendToUid($uid,json_encode($date));//返回发送者保存信息
               return;
           case "refuse":
               $toid = $message_data['toid'];
               if(Gateway::isUidOnline($toid)){
     //是否在线
                   $date=array('msg'=>$message_data['msg'],'type'=>'refuse');
                   Gateway::sendToUid($toid, json_encode($date));
               }
               return;
           case "pass":
               $toid = $message_data['toid'];
               if(Gateway::isUidOnline($toid)){
     //是否在线
                   $date=array('msg'=>$message_data['msg'],'type'=>'pass');
                   Gateway::sendToUid($toid,json_encode($date));
               }
               return;
       }
   }
   
   /**
    * 当用户断开连接时触发
    * @param int $client_id 连接id
    */
   public static function onClose($client_id)
   {
     
       // 向所有人发送 
//       GateWay::sendToAll("$client_id logout\r\n");
   }
}

前端
连接首先帮上我们自己定义的uid
之后实现业务操作

    var uid="{
       $uid}";
    ws =  new WebSocket("ws://127.0.0.1:1026");
    ws.onmessage=function(e){
     
        var message = eval("("+ e.data+")");
        switch (message.type){
     
            case  "init":
                var bild = '{"type":"bind","uid":"'+uid+'"}';
                ws.send(bild);
                return;
            case "notarize":
                layer.msg("您有新的合同需要审核");
                return;
            case "save":
                save_message(message);
                if(message.isread == 0){
     
                    layer.msg("对方不在线");
                }
                return;
            case "refuse":
                layer.msg(message.msg);
                return;
            case "pass":
                layer.msg(message.msg);
            return;
        }
    };
    function save_message(data) {
     
        $.ajax({
     
            type: "post",
            url: "{:url('rent/contract/contractNotarize')}",
            data: data,
            dataType:"json",
            success: function (res) {
     
                        }
        });
    }

向服务器推送消息ws.send(数据);
接收数据
ws.onmessage=function(e){
console.log(=e)
}

你可能感兴趣的:(PHP,php)