Start.php
3.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php
//本机IP是10.211.55.13
//需要监听的端口是 9090
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Worker;
use Workerman\Lib\Timer;
require 'workerman/Autoloader.php';
define('HEARTBEAT_TIME', 30);
//require 'workerman/Autoloader.php';
// 创建一个Worker监听9090端口,使用websocket协议通讯
$clients = []; //保存客户端信息
$ws_worker = new Worker("websocket://0.0.0.0:2345");
//$ws_worker = new Worker("websocket://172.20.0.131:9090");
// 启动4个进程对外提供服务
$ws_worker->count = 1;
/**
* 同步登录用户列表
*/
// 当收到客户端发来的数据后
$ws_worker->onMessage = function($connection, $data)
{
$connection->lastMessageTime = time();
global $ws_worker;
if(preg_match('/^admin_login:(\w{2,20})/i',$data,$result)){ //代表是客户端认证
$ip=$result[1];
//通过全局变量获得db实例
$connection->send('admin_login_ip '.$ip); //普通消息
echo $ip.'==>'.$result[1].'==>login2'.PHP_EOL; //这是为了演示,控制台打印信息
$connection->id=$ip;
}elseif(preg_match('/^user_login:(\w{2,20})/i',$data,$result)){ //代表是客户端认证
//通过全局变量获得db实例
$ip=$result[1];
$connection->send('user_login_ip'.$ip); //普通消息
echo $ip .'==>'.$result[1].'==>login2'.PHP_EOL; //这是为了演示,控制台打印信息
$connection->id=$ip;
}elseif (preg_match('/^chat:\<(.*?)\>:(.*?)/isU',$data,$msgset)){
//客服发送消息
$admin_ip = $msgset[1];
$msg = $msgset[2];
foreach ($ws_worker->connections as $k=>$v){
if($v->id==$admin_ip)
{
echo $v->id.':'.$admin_ip.PHP_EOL;
$v->send('msg:'.$msg);
}
}
}elseif (is_array(json_decode($data,'true'))) {
//vip发送消息
$res=json_decode($data,'true');
$admin_ip=$res['admin_ip'];
//$abc->gett($admin_ip)['conn']->send($data);
//$ws_worker->connections[$admin_ip]->send('msg:'.$data);
//$GLOBALS['clients'][$admin_ip]['conn']->send('msg:'.$data);
//$ws_worker->m_iparry[$admin_ip]['conn']->send($data);
foreach ($ws_worker->connections as $k=>$v){
if($v->id==$admin_ip)
{
echo $v->id.'::'.$admin_ip.PHP_EOL;
$v->send($data);
}
}
}
//设置连接的onClose回调
$connection->onClose = function($connection) //客户端主动关闭
{
// $connection->send('reload_connection');
// var_dump($connection);
// $close_id=$connection->worker->id;
// var_dump($close_id);
echo "connection closed\n";
// foreach ($ws_worker->connections as $k=>$v){
// if($v->id==$close_id)
// $v->send('reload_connection');
// }
};
};
//进程启动后设置一个每秒运行一次的定时器
// $ws_worker->onWorkerStart = function($ws_worker) {
// Timer::add(15, function()use($ws_worker){
// foreach ($ws_worker->connections as $k=>$v){
// $v->send('reload_connection');
// }
// });
// };
// 运行worker
Worker::runAll();