Swoole扩展实现PHP WebSocket服务端示例
Swoole为PHP提供了强大的异步网络编程能力,其中WebSocket是构建实时聊天和数据推送的常用协议。本文将通过一个完整的代码示例,演示如何基于Swoole的Protocol接口实现一个简单的WebSocket服务器。
环境准备
在开始编写代码之前,请确保开发环境中已正确安装并启用了Swoole扩展。您可以通过运行 php --ri swoole 来检查Swoole的版本信息及配置状态。本示例适用于支持Swoole协议层的PHP环境。
核心逻辑与代码实现
第1步:定义WebSocket协议处理类
Swoole提供了一个基类 Swoole\Network\Protocol\WebSocket,开发者只需继承该类并重写特定回调函数即可处理WebSocket生命周期事件。我们需要关注两个关键场景:
- 客户端下线(onClose):当连接断开时,可以选择通知其他在线用户或执行资源清理。
- 消息接收(onMessage):处理客户端发送的数据,并进行响应或广播。
以下代码展示了一个基础的协议处理类结构:
复制代码 代码如下:
<?php
define('DEBUG', 'on');
define("WEBPATH", str_replace("\\","/", __DIR__));
// 注意:实际项目中需确保 libs_config.php 存在且正确加载
require __DIR__ . '/../libs/lib_config.php';
class WebSocket extends Swoole\Network\Protocol\WebSocket
{
/**
* 客户端断开连接时的回调
*/
function onClose($serv, $client_id, $from_id)
{
// 此处可添加将下线消息发送给所有人的逻辑
// 例如:$this->broadcast($client_id, "User offline: " . $client_id);
parent::onClose($serv, $client_id, $from_id);
}
/**
* 接收到客户端消息时的回调
*/
function onMessage($client_id, $ws)
{
// 记录接收到的消息
$this->log("onMessage: ".$client_id.' = '.$ws['message']);
// 向当前客户端返回确认信息
$this->send($client_id, "Server received: ".$ws['message']);
// 若需群发,可调用 broadcast 方法
// $this->broadcast($client_id, $ws['message']);
}
/**
* 广播消息给所有其他连接的用户
*/
function broadcast($client_id, $msg)
{
foreach ($this->connections as $clid => $info)
{
if ($client_id != $clid)
{
$this->send($clid, $msg);
}
}
}
}
第2步:初始化并启动WebSocket服务
创建好协议处理类后,需要实例化服务对象,绑定协议,并配置服务器的运行参数。主要包括设置监听地址、端口、Worker进程数以及日志输出方式。
$AppSvr = new WebSocket();
// 加载外部配置文件(如有需要)
$AppSvr->loadSetting(__DIR__."/swoole.ini");
// 设置日志输出为控制台Echo,便于调试
$AppSvr->setLogger(new \Swoole\Log\EchoLog(true));
// 创建网络服务器,监听所有IP的9503端口
$server = new \Swoole\Network\Server('0.0.0.0', 9503);
// 绑定我们自定义的WebSocket协议处理类
$server->setProtocol($AppSvr);
// 启动服务,配置4个Worker进程以处理并发请求
$server->run(array('worker_num' =>4));
关键点说明
- 协议继承:通过继承
Swoole\Network\Protocol\WebSocket,Swoole会自动处理WebSocket协议的握手、分帧解析等底层细节,开发者只需专注于业务逻辑。 - 广播机制:示例中的
broadcast方法遍历当前连接列表,排除发送者本身,实现群发功能。在实际应用中,需注意性能优化,如使用频道组管理。 - 进程模型:配置
'worker_num' => 4表示启动4个工作进程来处理连接,这能显著提升服务器的并发处理能力。 - 调试模式:代码中开启了DEBUG常量,并使用了
EchoLog将日志打印到标准输出,方便在开发和测试阶段观察消息流转。
运行与验证
保存上述代码为 websocket_server.php 并在终端运行:
php websocket_server.php
服务启动后,可以使用任意WebSocket客户端(如浏览器控制台、Postman或专门的WebSocket测试工具)连接到 ws://your-ip:9503 进行双向通信测试。发送消息后,服务器应返回带有“Server received”前缀的确认信息,并在断开连接时触发 onClose 逻辑。
以上就是Swoole扩展实现PHP WebSocket服务端示例的详细内容,更多关于Swoole实战开发的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













