blade 6 anos atrás
pai
commit
d0c56ab2fb

Diferenças do arquivo suprimidas por serem muito extensas
+ 1402 - 581
vendor/GatewayWorker_linux/GatewayWorker/Applications/whisper/Events.php


+ 137 - 0
vendor/GatewayWorker_linux/GatewayWorker/Applications/whisper/Mlogic.php

@@ -0,0 +1,137 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/7/25
+ * Time: 14:24
+ */
+
+
+use \GatewayWorker\Lib\Gateway;
+use Workerman\Lib\Timer;
+
+class Mlogic
+{
+    private static $Instance = null;
+    private static $db = null;
+    private static $redis = null;
+    private static $redisTime = null;
+    public static $global = null;
+    private static $configPath = null;
+
+    public static function GetInstance()
+    {
+        if (!empty(self::$Instance)) {
+            return self::$Instance;
+        }
+
+        self::$Instance = new self();
+        self::$Instance->Init();
+
+        return self::$Instance;
+    }
+
+    private static function Init()
+    {
+        $mds = DIRECTORY_SEPARATOR;
+        if (strtolower(substr(PHP_OS, 0, 3)) == 'win') {
+            self::$configPath = realpath(dirname(__FILE__) . $mds . '..' . $mds . '..' . $mds . '..' . $mds . '..') . $mds . 'application' . $mds;
+        } else {
+            self::$configPath = realpath(dirname(__FILE__) . $mds . '..' . $mds . '..' . $mds . '..' . $mds . '..' . $mds . '..') . $mds . 'application' . $mds;
+        }
+
+        self::getDb();
+        self::getRedis();
+        self::getGlbData();
+    }
+
+    //workman 的共享数据插件
+    public static function getGlbData($cache = 1)
+    {
+        if ($cache) {
+            if (!empty(self::$global)) {
+                return self::$global;
+            }
+        }
+        self::$global = new \GlobalData\Client('127.0.0.1:2207');
+        return self::$global;
+    }
+
+    public static function getDb($cache = 1)
+    {
+        if ($cache) {
+            if (!empty(self::$db)) {
+                return self::$db;
+            }
+        }
+
+        $conf = require(self::$configPath . 'database.php');
+        self::$db = new \Workerman\MySQL\Connection($conf['hostname'], $conf['hostport'], $conf['username'], $conf['password'], $conf['database'], $conf['charset']);
+
+
+        return self::$db;
+    }
+
+    //实例化redis
+    public static function getRedis($cache = 1)
+    {
+        if ($cache) {
+            if (!empty(self::$redis)) {
+                return self::$redis;
+            }
+        }
+        $conf = require(self::$configPath . 'redis.php');
+        $redis = new \Redis();
+        $ret = $redis->connect($conf['host'], $conf['port']);
+        if (!$ret) {
+            return false;
+        }
+        if (!empty($conf['passwd'])) {
+            $ret = $redis->auth($conf['passwd']);
+            if (!$ret) {
+                return false;
+            }
+        }
+        $redis->select($conf['db']);
+        self::$redisTime = time();
+        echo "Redis Reconnect : " . date("Y-m-d H:i:s") . "\n";
+
+        self::$redis = $redis;
+        return self::$redis;
+    }
+
+    //redis ping ,看是否断线
+    public static function RedisPing()
+    {
+        $ret = self::$redis->ping();
+        //echo "redisPing: " . date("Y-m-d H:i:s") . ' - ' . $ret . "\n";
+        if (strpos(strtoupper($ret), "PONG") !== false) {
+            return true;
+        }
+        return false;
+    }
+
+    //发送消息的代理
+    public static function MySendMsg($clientId, $msg)
+    {
+        Gateway::sendToClient($clientId, $msg);
+    }
+
+    //客服是否正在登陆,或已经登陆 0未登陆   1正在登陆  2已登陆成功
+    public static function userIsLogin($client_id, $kfuid, $groupid)
+    {
+        $hakey = self::$redis->hget("loginTmp:" . $kfuid, $kfuid);
+        if ($hakey) {
+            return 1;
+        }
+
+        $cids = Gateway::getClientIdByUid($kfuid);
+        if (count($cids) > 0) {
+            return 2;
+        }
+
+        return 0;
+    }
+
+
+}

+ 59 - 17
vendor/GatewayWorker_linux/GatewayWorker/Applications/whisper/start_gateway.php

@@ -1,4 +1,4 @@
-<?php 
+<?php
 /**
  * This file is part of workerman.
  *
@@ -11,6 +11,7 @@
  * @link http://www.workerman.net/
  * @license http://www.opensource.org/licenses/mit-license.php MIT License
  */
+
 use \Workerman\Worker;
 use \Workerman\WebServer;
 use \GatewayWorker\Gateway;
@@ -20,8 +21,33 @@ use \Workerman\Autoloader;
 // 自动加载类
 require_once __DIR__ . '/../../vendor/autoload.php';
 
-// gateway 进程,这里使用Text协议,可以用telnet测试
-$gateway = new Gateway("Websocket://0.0.0.0:8282");
+$ifssl = false;
+
+if ($ifssl) {
+    $mds = DIRECTORY_SEPARATOR;
+    if (strtolower(substr(PHP_OS, 0, 3)) == 'win') {
+        $sslkeyPath = realpath(dirname(__FILE__) . $mds . '..' . $mds . '..' . $mds . '..' . $mds . '..') . $mds . 'application' . $mds . 'sslkey' . $mds;
+    } else {
+        $sslkeyPath = realpath(dirname(__FILE__) . $mds . '..' . $mds . '..' . $mds . '..' . $mds . '..' . $mds . '..') . $mds . 'application' . $mds . 'sslkey' . $mds;
+    }
+    // 证书最好是申请的证书
+    $context = array(
+        'ssl' => array(
+            'local_cert' => $sslkeyPath . 'ssl.crt', // 也可以是crt文件
+            'local_pk' => $sslkeyPath . 'ssl.key',
+            'verify_peer' => false,
+            //'verify_peer_name' => false,
+            'allow_self_signed' => true, //如果是自签名证书需要开启此选项
+        )
+    );
+    // gateway 进程,这里使用Text协议,可以用telnet测试
+    $gateway = new Gateway("Websocket://0.0.0.0:9101", $context);
+    //开启ssl
+    $gateway->transport = 'ssl';
+} else {
+    $gateway = new Gateway("Websocket://0.0.0.0:9101");
+}
+
 // gateway名称,status方便查看
 $gateway->name = 'WhisperGateway';
 // gateway进程数
@@ -29,37 +55,53 @@ $gateway->count = 4;
 // 本机ip,分布式部署时使用内网ip
 $gateway->lanIp = '127.0.0.1';
 // 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
-// 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口 
+// 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口
 $gateway->startPort = 2900;
 // 服务注册地址
 $gateway->registerAddress = '127.0.0.1:1238';
 
+
 // 心跳间隔
-$gateway->pingInterval = 10;
-// 心跳数据
+$gateway->pingInterval = 20;
+$gateway->pingNotResponseLimit = 2;
 $gateway->pingData = '{"message_type":"ping"}';
 
-/* 
+$tmpPath = isset($_SERVER['TEMP']) ? $_SERVER['TEMP'] : '/tmp';
+Worker::$logFile = $tmpPath . '/workerman_' . date("Y-m-d") . '.log';
+Worker::$stdoutFile = $tmpPath . '/stdout_' . date("Y-m-d") . '.log';
+
+
 // 当客户端连接上来时,设置连接的onWebSocketConnect,即在websocket握手时的回调
-$gateway->onConnect = function($connection)
-{
-    $connection->onWebSocketConnect = function($connection , $http_header)
-    {
+$gateway->onConnect = function ($connection) {
+    $connection->onWebSocketConnect = function ($connection, $http_header) {
+        //$apiToken = md5(strtolower('Customer-Service' . strtotime(date('Y-m-d')) . $_SERVER['HTTP_ORIGIN']));
+        $apiToken = md5(strtolower('Customer-Service' . $_SERVER['HTTP_ORIGIN']));
+        //echo $apiToken."/".$_GET['apiToken'];
+        $_SESSION['userAgent'] = $_SERVER['HTTP_USER_AGENT'];
+        $_SESSION['origin'] = $_SERVER['HTTP_ORIGIN'];//
+        $getToken = isset($_GET['apiToken']) ? $_GET['apiToken'] : '';
+
+        if ($getToken !== $apiToken) {
+            $connection->close();
+            return;
+        }
+        $_SESSION['remotip'] = $connection->getRemoteIp();
+        $_SESSION['remotport'] = $connection->getRemotePort();
+
+
         // 可以在这里判断连接来源是否合法,不合法就关掉连接
         // $_SERVER['HTTP_ORIGIN']标识来自哪个站点的页面发起的websocket链接
-        if($_SERVER['HTTP_ORIGIN'] != 'http://kedou.workerman.net')
+        /*if($_SERVER['HTTP_ORIGIN'] != 'http://kedou.workerman.net')
         {
             $connection->close();
-        }
+        }*/
         // onWebSocketConnect 里面$_GET $_SERVER是可用的
         // var_dump($_GET, $_SERVER);
     };
-}; 
-*/
+};
 
 // 如果不是在根目录启动,则运行runAll方法
-if(!defined('GLOBAL_START'))
-{
+if (!defined('GLOBAL_START')) {
     Worker::runAll();
 }
 

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff