讲师中心 微信公众号
AI工具推荐 视频效率加速

使用Webman + WebSocket实现实时在线聊天室

夏浩酱_2802

夏浩酱_2802

发布时间:2026-06-07 17:58:02

|

789人浏览过

|

来源于php中文网

原创

WebSocket连接建立后立刻断开,根本原因是HTTP与WS端口未分离:Webman默认仅启HTTP服务,WebSocket必须由独立端口(如7272)承载,不可复用HTTP端口;直接修改config/server.php中type为websocket会导致HTTP路由失效且ws://无法连接。

使用webman + websocket实现实时在线聊天室

WebSocket连接建立后立刻断开?检查Webman的HTTP和WS端口是否分离

Webman默认只启动HTTP服务,websocket协议必须由独立的WebSocket服务器承载,不能复用HTTP端口。常见错误是直接在config/server.php里把type改成websocket——这会导致HTTP路由失效,且客户端用ws://连不上。

正确做法是启用双端口:HTTP端口(如8080)处理静态资源和登录页,WebSocket端口(如7272)专供ws://连接。需在config/server.php中添加第二个server配置:

[
    'name' => 'websocket',
    'type' => 'websocket',
    'host' => '0.0.0.0',
    'port' => 7272,
    'sock_type' => SWOOLE_SOCK_TCP,
    'ssl' => false,
]

注意:type必须为websocket,不是http;若启用HTTPS,ssl设为true,且需配ssl_cert_file和ssl_key_file。

onMessage里发消息给所有人?别直接遍历$connections

Webman的WebSocket\Connection对象不支持直接foreach($this->connections),因为底层使用Swoole协程,连接池是跨进程隔离的。硬遍历只会拿到当前Worker进程里的连接,导致“部分人收不到消息”。

必须通过Webman\WebSocket\Server提供的广播方法:

  • $server->broadcast($data):向所有在线连接广播(自动跨Worker)
  • $server->to($fd)->send($data):向指定fd发送(fd来自$connection->getFd())
  • $server->to($group)->send($data):需先调用$server->join($fd, $group)加入分组

示例:用户发消息时带上昵称和时间,广播给所有人:

public function onMessage($connection, $data)
{
    $msg = json_decode($data, true);
    $broadcastData = [
        'type' => 'chat',
        'nickname' => $msg['nickname'] ?? '匿名',
        'content' => htmlspecialchars($msg['content']),
        'time' => date('H:i')
    ];
    $this->server->broadcast(json_encode($broadcastData, JSON_UNESCAPED_UNICODE));
}

用户离线状态不准?主动close()比等待超时更可靠

浏览器标签页关闭、网络中断等场景下,onClose不一定立即触发——Swoole默认等待60秒才判定连接断开。这会导致onClose里清理用户状态延迟,出现“人已走但头像还亮着”的问题。

WebSocket 8.18.2
WebSocket 8.18.2

WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。

下载

应在前端监听beforeunload或pagehide,主动发送离线包:

window.addEventListener('beforeunload', () => {
    if (ws && ws.readyState === WebSocket.OPEN) {
        ws.send(JSON.stringify({type: 'logout'}));
        ws.close();
    }
});

后端onMessage中识别该类型并立即清理:

if ($msg['type'] === 'logout') {
    // 从session或redis中移除该fd对应用户
    $this->server->disconnect($connection->getFd());
    return;
}

同时建议在onClose里做兜底清理,但不依赖它作为唯一离线依据。

上线人数突增就卡顿?避免在onOpen/onClose里查数据库

每有1个用户连接/断开,onOpen和onClose都会执行。如果在里面调用MySQL查询或RedisHGETALL,高并发时会阻塞整个Worker进程,造成连接堆积甚至雪崩。

优化方向:

  • 用户信息尽量存在内存(如$_SESSION或static::$userCache),首次登录时存,后续复用
  • 在线人数统计改用Redis原子操作:INCR online_count / DECR online_count
  • 如需持久化用户状态,改用协程MySQL客户端(co\MySQL)或投递到TaskWorker异步处理

特别注意:Webman的onOpen是同步上下文,不能await协程,强行go()也不推荐——优先精简逻辑,而非加协程。

真实压测中,未优化的onOpen查一次DB会让QPS从3000+掉到不足500;去掉DB调用后,单Worker轻松支撑5000+并发连接。

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
Golang WebSocket与实时通信开发
Golang WebSocket与实时通信开发

本专题系统讲解 Golang 在 WebSocket 开发中的应用,涵盖 WebSocket 协议、连接管理、消息推送、心跳机制、群聊功能与广播系统的实现。通过构建实际的聊天应用或实时数据推送系统,帮助开发者掌握 如何使用 Golang 构建高效、可靠的实时通信系统,提高并发处理与系统的可扩展性。

175

2025.12.22

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

396

2026.01.19

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

755

2026.03.18

WebSocket 前端开发与实战技巧
WebSocket 前端开发与实战技巧

聚焦 WebSocket 在前端项目中的工程化实践,涵盖原生 JavaScript WebSocket 连接的封装与状态管理、Vue 3 中 WebSocket 的 Composable 封装(useWebSocket)、React 中自定义 Hook 管理连接生命周期、心跳检测(Ping/Pong 定时器)与自动断线重连的实现策略、指数退避重连算法、消息序列化协议(JSON / Protobuf / MessagePack)的选型与性

428

2026.05.25

WebSocket发送和接收数据教程合集
WebSocket发送和接收数据教程合集

本专题整合了WebSocket发送与接收数据教程合集,阅读专题下面的文章了解更多详细内容。

301

2026.05.25

Webman入门教程合集
Webman入门教程合集

本专题聚焦Webman高性能PHP框架,为您提供零基础入门的一站式全攻略。内容涵盖开发环境搭建全流程、核心原理解析(如目录结构、生命周期)及API接口实战开发。无论您是初次接触还是进阶巩固,都能在此找到实用的教程合集,助您快速掌握这款“常驻内存”的PHP利器,实现高性能后端应用的高效构建。

237

2026.05.21

Webman框架集成与数据库配置
Webman框架集成与数据库配置

本专题聚焦 Webman 高性能 PHP 框架,为您提供一站式后端开发全攻略。内容深度涵盖框架快速入门、多数据库进阶配置(Eloquent & ThinkORM)、以及企业级核心组件集成(如 JWT 鉴权、RabbitMQ 消息队列、Elasticsearch 全文搜索)。

187

2026.05.21

Webman常见问题与错误排查
Webman常见问题与错误排查

本专区深度聚焦 Webman 高性能框架常见故障与性能调优,为您提供一站式全能排查攻略。内容精准覆盖 404/500 核心报错修复、内存溢出(Memory Limit)深度排查、以及 Redis 连接与 Session 失效等开发者高频痛点。

329

2026.05.21

C++虚函数怎么定义和调用
C++虚函数怎么定义和调用

C++虚函数是实现运行时多态的重要机制。本专题从virtual关键字的基本用法入手,介绍基类与派生类之间的函数重写、基类指针调用派生类方法,以及动态绑定的执行过程,帮助初学者掌握虚函数的核心语法。

0

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman和FastAPI的性能对比
Webman和FastAPI的性能对比

共0课时 | 313人学习

Webman中文手册
Webman中文手册

共0课时 | 0人学习

webman初步使用及后台搭建
webman初步使用及后台搭建

共15课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn