janfish / zhoutian-stomp-client
A PHP WebSocket STOMP client for real-time messaging
Installs: 3
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/janfish/zhoutian-stomp-client
Requires
- php: >=8.1
- cboden/ratchet: ^0.4.4
- guzzlehttp/psr7: ^1.7
- ratchet/pawl: ^0.3
- react/event-loop: ^1.3
- react/socket: ^1.12
- react/stream: ^1.2
Requires (Dev)
- phpunit/phpunit: ^10.0
- squizlabs/php_codesniffer: ^3.7
This package is not auto-updated.
Last update: 2026-01-01 05:00:02 UTC
README
一个基于 PHP 的 WebSocket STOMP 客户端插件,专为实时告警通知系统设计。
主要功能
- WebSocket 连接管理: 自动重连机制,确保连接稳定
- STOMP 协议支持: 完整的 STOMP 1.2 协议实现
- 告警消息处理: 专门针对告警通知的消息格式处理
- 异步事件驱动: 基于 ReactPHP,支持高并发处理
安装
composer require janfish/websocket-stomp
快速开始 - 接收通知
1. 基础使用(接收告警通知)
<?php require_once 'vendor/autoload.php'; use Janfish\WebSocketStomp\Client\StompClient; use Janfish\WebSocketStomp\Handler\AlertMessageHandler; // 配置参数 $config = [ 'url' => 'wss://your_ws_domain/', // WebSocket服务器地址 'headers' => [ 'Authorization' => 'Bearer your-jwt-token-here', // JWT认证令牌 'accept-version' => '1.2,1.1,1.0', // STOMP协议版本 'heart-beat' => '4000,4000' // 心跳间隔 ], 'reconnect_delay' => 5000, // 重连延迟(毫秒) 'heartbeat_incoming' => 4000, // 心跳接收间隔(毫秒) 'heartbeat_outgoing' => 4000, // 心跳发送间隔(毫秒) 'debug' => true, // 调试模式 ]; // 创建告警处理器 $alertHandler = new AlertMessageHandler([ 'useDefaultSound' => 1, // 使用默认声音 'audioFile' => 'default.wav', // 音频文件 'playTimes' => 1, // 播放次数 'display' => 1, // 显示通知 'playInterval' => 3, // 播放间隔(秒) 'debug' => true, // 调试模式 ]); // 添加告警处理回调 $alertHandler->addCallback(function ($alertData) { echo "收到告警: " . json_encode($alertData, JSON_UNESCAPED_UNICODE) . "\n"; // 这里可以添加自定义处理逻辑 // 例如:写入数据库、发送邮件、调用其他API等 // 示例:提取关键信息 if (isset($alertData['warnTime'])) { echo "告警时间: " . $alertData['warnTime'] . "\n"; } if (isset($alertData['mac'])) { echo "设备MAC: " . $alertData['mac'] . "\n"; } if (isset($alertData['address'])) { echo "地址: " . $alertData['address'] . "\n"; } if (isset($alertData['hotelName'])) { echo "酒店: " . $alertData['hotelName'] . "\n"; } }); try { // 创建STOMP客户端 $client = new StompClient($config); echo "正在连接WebSocket服务器...\n"; // 连接服务器 $client->connect()->then(function () use ($client, $alertHandler) { echo "WebSocket连接成功!\n"; // 获取用户信息(这里需要根据实际情况获取) $deptId = '96'; // 替换为实际的用户部门ID // 订阅WiFi告警主题 $client->subscribe("/topic/warn/wifi/{$deptId}", function ($frame) use ($alertHandler) { echo "收到WiFi告警\n"; $alertHandler->handleWifiAlert($frame); }); // 订阅STA告警主题 $client->subscribe("/topic/warn/sta/{$deptId}", function ($frame) use ($alertHandler) { echo "收到STA告警\n"; $alertHandler->handleStaAlert($frame); }); // 订阅周天告警频道 $client->subscribe("/topic/warn/airlock/{$deptId}", function ($frame) use ($alertHandler) { echo "收到周天告警\n"; $alertHandler->handleAirlockAlert($frame); }); echo "已订阅所有告警主题\n"; }, function ($error) { echo "连接失败: " . $error->getMessage() . "\n"; }); // 运行事件循环 $client->getLoop()->run(); } catch (\Exception $e) { echo "错误: " . $e->getMessage() . "\n"; }
2. 告警消息格式
接收到的告警消息格式如下:
{
"type": "alert",
"data": {
"warnTime": "2023-12-31 15:30:00",
"mac": "AA:BB:CC:DD:EE:FF",
"deviceType": "WiFi设备",
"address": "北京市朝阳区",
"hotelName": "测试酒店",
"rooms": "8301",
"warnSite": "3楼走廊",
"warnLocation": "北京市朝阳区测试酒店3楼走廊"
},
"settings": {
"useDefaultSound": 1,
"audioFile": "default.wav",
"playTimes": 1,
"display": 1,
"playInterval": 3,
"debug": true
},
"timestamp": 1703415000
}
3. 关键配置说明
$config = [ 'url' => 'wss://your_ws_domain/', // WebSocket服务器地址 'headers' => [ // 自定义请求头 'Authorization' => 'Bearer your-jwt-token', 'accept-version' => '1.2,1.1,1.0', 'heart-beat' => '4000,4000' ], 'reconnect_delay' => 5000, // 重连延迟(毫秒) 'heartbeat_incoming' => 4000, // 心跳接收间隔(毫秒) 'heartbeat_outgoing' => 4000, // 心跳发送间隔(毫秒) 'debug' => true, // 调试模式 ];
高级功能
自动重连
$client = new StompClient([ 'url' => 'wss://your_ws_domain/', 'reconnect_delay' => 5000, // 重连间隔(毫秒) 'debug' => true ]);
多主题订阅
// 获取部门ID $deptId = '96'; // 替换为实际部门ID // 订阅多个告警主题 $client->subscribe("/topic/warn/wifi/{$deptId}", $callback); // WiFi告警 $client->subscribe("/topic/warn/sta/{$deptId}", $callback); // STA告警 $client->subscribe("/topic/warn/airlock/{$deptId}", $callback); // 周天告警
错误处理
$client->connect()->then(function () { // 连接成功处理 echo "连接成功!\n"; }, function ($error) { // 连接失败处理 echo "连接失败: " . $error->getMessage() . "\n"; });
Docker 使用
快速启动
# 运行接收通知示例 php examples/client.php # 运行单元测试 ./vendor/bin/phpunit tests/
完整示例
查看 examples/ 目录获取更多示例:
examples/client.php- 基础告警接收客户端(推荐)examples/alert-client.php- 告警客户端(简化版)examples/advanced-alert-client.php- 高级功能演示
测试
# 功能测试 php test-functionality.php # 单元测试 ./vendor/bin/phpunit tests/
调试技巧
1. 开启调试模式
$config = [ 'url' => 'wss://your_ws_domain/', 'debug' => true // 开启调试输出 ]; $alertHandler = new AlertMessageHandler([ 'debug' => true // 开启告警处理器调试 ]);
2. 日志记录
$alertHandler->addCallback(function($alertData) { // 记录接收到的告警 error_log("收到告警: " . json_encode($alertData, JSON_UNESCAPED_UNICODE)); // 您的处理逻辑... });
3. 连接状态监控
if (!$client->isConnected()) { echo "未连接到服务器\n"; } else { echo "已连接到服务器\n"; }
⚠️ 注意事项
- 认证令牌: 确保使用有效的 JWT 认证令牌
- 部门 ID: 替换为实际的用户部门 ID
- 网络稳定性: 建议使用自动重连功能确保连接稳定
- 消息处理: 告警消息处理函数中避免长时间阻塞操作
- 错误处理: 始终设置错误处理函数
- 资源释放: 程序退出时调用
$client->disconnect()释放资源