server.php
4.3 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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<?php
require_once __DIR__ . '/simplewind/vendor/autoload.php';
require_once __DIR__ . '/simplewind/vendor/workerman/workerman/Autoloader.php';
use Workerman\Worker;
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(['数据库配置参数(数组)']);
$tcp_worker = new Worker("websocket://114.215.223.17:5001");
$tcp_worker->name='panhaowen';
// 启动4个进程对外提供服务
$tcp_worker->count = 1;
$tcp_worker->uidConnections = array();
//$tcp_worker->onWorkerStart=function ($tcp_worker){
// Timer::add(10, function()use($tcp_worker)
// {
// // 遍历当前进程所有的客户端连接,发送当前服务器的时间
// foreach($tcp_worker->connections as $connection)
// {
// $connection->send(time());
// }
// });
//};
$tcp_worker->onConnect = function($connection)
{
echo $connection->id;
};
// 当客户端发来数据时
$tcp_worker->onMessage = function($connection, $data) {
global $tcp_worker;
// 判断当前客户端是否已经验证,即是否设置了uid
if(!isset($connection->uid))
{
// 没验证的话把第一个包当做uid(这里为了方便演示,没做真正的验证)
$connection->uid = $data;
/* 保存uid到connection的映射,这样可以方便的通过uid查找connection,
* 实现针对特定uid推送数据
*/
$tcp_worker->uidConnections[$connection->uid] = $connection;
// var_dump( $tcp_worker->uidConnections[$connection->uid]);
return $connection->send('login success, your uid is ' . $connection->uid);
}
// $data = json_encode($data);
// echo $data;
// echo $connection->id;
// $re = DB::name('test')->insert()
};
function sendMessageByUid($uid, $message)
{
global $worker;
if(isset($worker->uidConnections[$uid]))
{
$connection = $worker->uidConnections[$uid];
$connection->send($message);
}
}
Worker::runAll();