使用swoole可快速搭建百人级并发websocket聊天室:需php 7.4+并启用swoole扩展,编写chat-server.php实现消息广播,前端用原生js连接ws://127.0.0.1:9501并json封装消息。

要快速搭建一个支持多人实时消息收发的在线聊天室,Swoole提供了基于事件驱动的异步TCP/HTTP服务器能力,无需依赖Nginx或Apache即可独立运行,且能轻松承载百人级并发连接。
安装并启用Swoole扩展
确认PHP版本在7.4以上(推荐8.1),执行pecl install swoole;若提示找不到pecl,先运行apt install php-pear(Ubuntu)或yum install php-pear(CentOS)。
编辑php.ini,添加extension=swoole,保存后执行php -m | grep swoole,看到输出即表示加载成功。
这一步不可跳过——【未启用swoole扩展时,后续所有代码都会报Class 'Swoole\WebSocket\Server' not found】。
编写WebSocket服务端逻辑
创建chat-server.php文件,写入以下核心代码:
实例化Swoole\WebSocket\Server对象,监听0.0.0.0:9501;注册onOpen、onMessage、onClose三个回调函数;在onMessage中对收到的消息做JSON解码,并用$server->push()广播给所有在线客户端。
注意:不要在onMessage里直接echo或var_dump,会中断协程导致连接异常断开。
实现前端WebSocket客户端界面
新建index.html,内嵌一个<textarea id="msg"></textarea>和<button onclick="send()">发送</button>,再加一个<div id="log"></div>用于显示消息流。
使用原生JavaScript初始化WebSocket连接:const ws = new WebSocket('ws://127.0.0.1:9501');;监听onmessage事件,将event.data解析为JSON后追加到#log中;发送前必须封装成{type:'chat', content:'xxx', nickname:'user1'}格式对象再JSON.stringify()发送。
这一步若漏掉JSON封装,服务端json_decode($frame->data, true)会返回null,消息无法被识别和转发。
启动服务并测试连通性
第一步:终端进入项目目录,执行php chat-server.php;
第二步:打开浏览器访问http://127.0.0.1/index.html;
第三步:新开一个无痕窗口也访问同一地址;
第四步:任一窗口输入消息并点击发送,另一窗口应立即收到相同内容。
如果控制台报错WebSocket connection to 'ws://...' failed,检查是否防火墙拦截了9501端口,或服务端进程未运行。











