Start.php
4.33 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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<?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', 25);
//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;
$count=0;
/**
* 同步登录用户列表
*/
function syncUsers($clients='')
{
$myfile = fopen("newfile.txt", "w") or die("Unable to open file!");
fwrite($myfile, $clients);
fclose($myfile);
}
function sel_user()
{
$myfile = fopen("newfile.txt", "r") or die("Unable to open file!");
$a=fread($myfile,filesize("newfile.txt"));
fclose($myfile);
return json_decode($a,'true');
}
// 当收到客户端发来的数据后
$ws_worker->onMessage = function($connection, $data)
{
$connection->lastMessageTime = time();
global $clients;
global $count;
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; //这是为了演示,控制台打印信息
// $GLOBALS['rt'][$ip] = ['ip'=>$ip,'conn'=>$connection];
$GLOBALS['clients'][$ip] = ['ip'=>$ip,'conn'=>$connection];
//$abc->add($ip,['ip'=>$ip,'conn'=>$connection]);
//$ws_worker->m_iparry[$ip]=['ip'=>$ip,'conn'=>$connection];
//$connection->id=$ip;
$count++;
}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; //这是为了演示,控制台打印信息
// $GLOBALS['rt'][$ip] = ['ip'=>$ip,'conn'=>$connection];
$GLOBALS['clients'][$ip] = ['ip'=>$ip,'conn'=>$connection];
//$abc->add($ip,['ip'=>$ip,'conn'=>$connection]);
//$ws_worker->m_iparry[$ip]=['ip'=>$ip,'conn'=>$connection];
$count++;
//$connection->id=$ip;
}elseif (preg_match('/^chat:\<(.*?)\>:(.*?)/isU',$data,$msgset)){
//客服发送消息
$admin_ip = $msgset[1];
$msg = $msgset[2];
$GLOBALS['clients'][$admin_ip]['conn']->send('msg:'.$msg);
//$abc->gett($admin_ip)['conn']->send('msg:'.$msg);
//$ws_worker->m_iparry[$admin_ip]['conn']->send('msg:'.$msg);
//$ws_worker->connections[$admin_ip]->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->m_iparry[$admin_ip]['conn']->send($data);
//$ws_worker->connections[$admin_ip]->send('msg:'.$data);
$GLOBALS['clients'][$admin_ip]['conn']->send('msg:'.$data);
}
//设置连接的onClose回调
$connection->onClose = function($connection) //客户端主动关闭
{
// unset($GLOBALS[$connection->getRemoteIp().':'.$connection->getRemotePort()]);
//客户端关闭
//即退出登录,也需要更新用户列表数据
//syncUsers();
echo "connection closed\n";
};
echo $count."\n";
//var_dump($GLOBALS['clients']);
};
// 进程启动后设置一个每秒运行一次的定时器
$ws_worker->onWorkerStart = function($ws_worker) {
Timer::add(1, function()use($ws_worker){
$time_now = time();
foreach($ws_worker->connections as $connection) {
// 有可能该connection还没收到过消息,则lastMessageTime设置为当前时间
if (empty($connection->lastMessageTime)) {
$connection->lastMessageTime = $time_now;
continue;
}
// 上次通讯时间间隔大于心跳间隔,则认为客户端已经下线,关闭连接
if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) {
$connection->close();
}
}
});
};
// 运行worker
Worker::runAll();