在普通的PHP代码里面,我们不需要考虑性能和异步问题,包括不限于我们想要使用php搭建一个http服务器(在node/python/go里面都有http模块,但是PHP没有这种功能)。而同样的原因,很难实现php游戏的开发,需要webSocket长链接和异步相关处理。
安装(win服务器上安装比较费劲,不建议win运行swoole),我们已经搭建了我们的后台服务器管理中心。直接到PHP扩展里面安装即可,如果想要手动安装,需要按照官方的命令去安装,服务器管理后台会自动帮我们配置好。
开始测试搭建一个swoole的http服务器(官方的demo)
然后直接使用php demo.php挂起到服务器里面(如果要守护)
这样就表示我们搭建swoole实现成功。我们也可以在进程里面看下9501的端口,直接lsof | grep “9501” 可以看到当前进程在运行,这样就完成了一个简单的http服务器搭建。也就是swoole最简单的使用。
现在我们加深难度,我们要创造一个webSocket 并进行调试。同样我们使用官方的webSocket代码。
使用php demo.php 直接跑起来,只要显示成功即表示我们的webSocket服务器成功链接。然后使用我们的APIFOX增加webSocket接口调试功能
发送一条消息,简单成功:
这样表示已经和服务器建立了链接。我们客户端不断发出请求,服务器可以很快速度响应,不用跟http协议一样反复断开和链接,效率大幅度提升。
Websocket通讯成功,API调试接口也成功,现在继续加深难度,我们搭建一个简单的多人聊天室,同时告知各个在线的情况。依旧很简单:
多人聊天室最简单的情况:
// 创建一个 Swoole HTTP 服务器
$server = new Swoole\Websocket\Server("0.0.0.0", 9501);
// 监听 WebSocket 连接打开事件
$server->on('open', function (Swoole\Websocket\Server $server, $request) {
echo "New connection: {$request->fd}\n";
});
// 监听 WebSocket 消息事件
$server->on('message', function (Swoole\Websocket\Server $server, $frame) {
echo "Received message: {$frame->data}\n";
// 广播消息给所有客户端
foreach ($server->connections as $fd) {
$server->push($fd, $frame->fd.':'.$frame->data);
}
});
// 监听 WebSocket 连接关闭事件
$server->on('close', function ($server, $fd) {
echo "Connection close: {$fd}\n";
});
echo "聊天室启动";
// 启动服务器
$server->start();
对话聊天窗口
我们已经完成了一个最简单的群聊天逻辑,现在我们将系统继续复杂化,就是允许客户端定义自己的昵称,同时离开的时候,也要告诉其他人昵称谁来了,谁走了。(和我们WX群聊天已经有点类似)这个时候,我们需要定义参数:
// 创建一个 Swoole HTTP 服务器
$server = new Swoole\Websocket\Server("0.0.0.0", 9501);
$uid = 0 ;
$username = '' ;
$touid = 0 ;
$account = [
'uid'=>$uid,
'username'=>$username,
'touid'=>$touid,
'fd'=>0
];
// 监听 WebSocket 连接打开事件
$server->on('open', function (Swoole\Websocket\Server $server, $request)use (&$account) {
$account['uid'] = $request->get['uid'];
$account['username'] = $request->get['username'];
$account['touid'] = $request->get['touid'];
$account['fd'] = $request->fd ;
echo "New connection: { $request->fd}\n";
foreach ($server->connections as $fd) {
$server->push($fd, $account['username']."来了");
}
});
// 监听 WebSocket 消息事件
$server->on('message', function (Swoole\Websocket\Server $server, $frame)use (&$account) {
// 广播消息给所有客户端
foreach ($server->connections as $fd) {
$server->push($fd, $account['username'].':'.$frame->data);
}
});
// 监听 WebSocket 连接关闭事件
$server->on('close', function ($server, $fd) use (&$account){
echo "Connection close: {$fd}\n";
// 广播消息给所有客户端
foreach ($server->connections as $fd) {
$server->push($fd, $account['username'].'潇洒的离开了');
}
});
echo "聊天室启动";
// 启动服务器
$server->start();
加入的昵称已经实现:
小结: 简单的多人聊天室后端已经完成,前端使用的是API调试工具,已经可以看到来去昵称。掌握swoole 搭建http服务器,理解webSocket 搭建webSocket服务器,掌握APIfox调试WS协议的方法,完成基础的swoole用法,包括变量获取和交互。