1、因为是tp5.0 使用的框架是fastadmin所以安装think_swoole就出现了问题
- 1.解决方案 切换版本
composer require topthink/think-swoole=1.0.* //tp5.0使用
- 配置nginx支持https
在server上面加上这几句话
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# 这里的backend可以改成自己需要的名称,我自己用的是wss。
upstream wss {
# 这里的localhost是映射本地服务器,也可以是外网ip,9502是我ws开启的端口。
server localhost:9502;
}
server里面加上这句话
location /wss {
proxy_pass http://你的服务器ip:9502;#代理到上面的地址去,
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
3.修改伪静态
# 注意:这里的/wss后面没有/了哦
location /wss {
proxy_pass http://wss;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
} 这里面伪静态加上这句话上面的nginx里面的location /wss...这句话可以不设置
- 创建服务端swolle文件
<?php
namespace app\index\controller;
use think\swoole\Server;
class Swoole extends Server
{
protected $host = '0.0.0.0'; //监听所有地址
protected $port = 9502; //监听9502端口
protected $serverType = 'socket';//使用webscoket;默认是http
protected $option = [
'worker_num'=> 4, //设置启动的Worker进程数
'daemonize' => false, //守护进程化(上线改为true)
'backlog' => 128, //Listen队列长度
'dispatch_mode' => 2, //固定模式,保证同一个连接发来的数据只会被同一个worker处理
//心跳检测:每60秒遍历所有连接,强制关闭10分钟内没有向服务器发送任何数据的连接
'heartbeat_check_interval' => 60,
'heartbeat_idle_time' => 600
];
//建立连接时回调函数
public function onOpen($server,$req)
{
$fd = $req->fd;//客户端标识
//省略给用户绑定fd逻辑......
echo "用户{$fd}建立了连接,标识为{$fd}\n";
}
//接收数据时回调函数
public function onMessage($server,$frame)
{
$fd = $frame->fd;
$message = $frame->data;//客户端传递的消息
$arr = []
//仅推送给当前连接用户
$server->push($fd, json_encode($arr));
}
//连接关闭时回调函数
public function onClose($server,$fd)
{
echo "标识{$fd}关闭了连接\n";
}
}
- 测试连接(html测试)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
function initWebSocket(wsUri) {
var websocket = new WebSocket(wsUri);
websocket.onopen = function (evt) {
console.log("连接建立中... " + wsUri);
};
websocket.onclose = function (evt) {
console.log("连接关闭中...", evt);
};
websocket.onmessage = function (evt) {
console.log("收到来自服务端的消息:", evt.data);
};
websocket.onerror = function (evt) {
console.log("发生错误...", evt);
};
return websocket;
}
//因为是HTTPS 使用wss了 需要域名 http 使用ip+端口
var websocket = initWebSocket("wss://你的域名/wss");
var msg,
i = 0;
var loop = setInterval(function () {
msg = "Hello " + i++;
if (websocket.readyState == WebSocket.OPEN) {
websocket.send(msg);
console.log("已发送消息:" + msg);
} else {
clearInterval(loop);
console.log("连接已关闭,拜拜~");
}
}, 3000);
</script>
</body>
</html>
在浏览器consle里面查看是否成功
- 在项目跟目录创建启动文件(名字随意)
<?php
define('APP_PATH', __DIR__ . '/../application/');
define('BIND_MODULE','index/Swoole');//后面是你的swolle文件位置
require __DIR__ . '/../thinkphp/start.php';
然后在项目根目录执行 php 你的启动文件名.php start
netstat -anp |grep 端口号 ---查看占用端口进程
kill -9 进程id 杀掉端口
- 微信小程序测试连接
wx.connectSocket({
url: "wss://xxxxx:9502"
});
wx.onSocketOpen(function (res) {
console.log('WebSocket连接已打开!');
console.log(res);
wx.sendSocketMessage({//发送测试数据
data: "mamamamama",
complete: function (res) {
console.log("sendSocketMessage");
console.log(res);
}
});
});
wx.onSocketError(function (res) {
console.log('WebSocket连接打开失败,请检查!');
console.log(res);
});
wx.onSocketMessage(function (res) {
console.log('收到服务器内容:' + res.data)
});