php使用wokerman实现实时订单提醒
2021-08-31 本文已影响0人
风度翩翩的程序猿
首先我们先下载wokerman [ https://www.workerman.net/download ]
下载下来引入自己的server.php
代码如下
<?php
use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';
// 注意:这里与上个例子不同,使用的是websocket协议
$ws_worker = new Worker("websocket://211.149.141.92:666");
$ws_worker->onConnect = function ($conn) { // 当有用户连接时我要做的事情 $conn 保存当前连接的用户
// echo 'hello';
\Workerman\Lib\Timer::add(60, function () use ($conn) {
$conn->send('ping'); // 发送消息,接收一个字符串,该字符串就会发送到客户端
}); // 秒,要执行的逻辑
};
// // 启动4个进程对外提供服务
$ws_worker->count = 1;
$ws_worker->connection_uids=array(); //保存每个用户的connection
// 当收到客户端发来的数据后返回 $data给客户端
$ws_worker->onMessage = function ($conn, $data) {
// 数组 $conn->worker->connections // 保存了所有的客户端连接
// 遍历每个连接
// foreach ($conn->worker->connections as $key=>$val){
// if($val != $conn){ // 除了自己 发给其他人
// $val->send($data);
// }
// }
// 0类型 1发给谁uid 2消息 3to 发给谁uid
global $ws_worker;
$d = explode(':',$data);
switch($d[0]){
case 'login':
$conn->uid=$d[1];
$ws_worker->connection_uids[$d[1]]=$conn;
echo "收到登录请求,uid=".$d[1]."\n";
break;
case 'send_message':
if($d[3]=='all'){
// echo "向全部用户发送消息\n";
broadcast('全部用户');
}else{
// 给指定的人发送消息
// echo "向用户".$d[3]."发送消息\n";
sendMessageByUid($d[3],$d[2]);
}
break;
default:
break;
}
};
$ws_worker->onError = function ($conn) { // 出错了怎么办
};
$ws_worker->onClose = function ($conn) { // 关闭连接怎么办
global $ws_worker;
echo "用户{$conn->uid}退出\n";
if(isset($conn->uid)){
unset($ws_worker->connection_uids[$conn->uid]);
}
};
//向所有用户发送消息
function broadcast($message){
global $ws_worker;
foreach($ws_worker->connections as $conn){
$conn->send($message);
}
}
//向某个用户发送消息
function sendMessageByUid($uid,$message){
global $ws_worker;
if(isset($ws_worker->connection_uids[$uid])){
$conn=$ws_worker->connection_uids[$uid];
$conn->send($message);
}
}
// 运行worker
$ws_worker->runAll();
客户端
<html>
<body>
<div id="b">
</div>
<input type="text" id="a"/>
<button onclick="send();">发送</button>
</body>
<script>
// socket客户端
var ws = new WebSocket('ws://211.149.141.92:2000');
ws.onopen = function (event) {
};
ws.onmessage=function (event) {
// var d = JSON.parse(event.data);
// if(d.type == 'msg'){
// alert(d.content)
// }
console.log(event)
};
ws.onerror=function (event) {
};
ws.onclose=function (event) {
};
function send() {
var btn = document.getElementById('a');
ws.send(btn.value); // 发送到服务器
}
</script>
</html>
***需要注意的workerman的适应的环境,window不需要任何扩展依赖,Linux就不同了,详细的请看文档[http://doc3.workerman.net/315115] 还有就是开启服务必须是命令行 ***
以debug(调试)方式启动
`php start.php start`
以daemon(守护进程)方式启动
`php start.php start -d`
### 停止
`php start.php stop`
### 重启
`php start.php restart`
### 平滑重启
`php start.php reload`
### 查看状态
`php start.php status`