Swoole协程服务器三步即可上线百人实时聊天:①安装Swoole扩展并启用协程(PHP≥7.4,pecl install swoole,php.ini加extension=swoole.so和swoole.enable_coroutine=On);②编写chat-server.php,用Swoole\WebSocket\Server监听9502端口,onOpen打印连接,onMessage广播消息;③前端HTML直连ws://localhost:9502,带uid参数标识发送者,配合Supervisor守护进程。

你想在PHP网站上快速上线一个能撑住百人同时在线的实时聊天功能,不需要等Redis集群部署、不用写消息队列中间件、不依赖第三方云服务——Swoole协程服务器一条命令就能跑起来,连接建立即通,消息秒达。
装好Swoole扩展并确认协程可用
先确保PHP环境满足最低要求:执行php -v,版本必须是7.4或8.0及以上。【低于7.4将无法启用协程】
运行pecl install swoole安装扩展,在交互式提示中务必选择enable coroutines选项(按回车默认为yes,但请盯住终端确认)。
编辑php.ini,追加两行:
extension=swoole.soswoole.enable_coroutine=On
重启PHP-FPM或内置服务器后,执行php --ri swoole,输出中看到coroutine => enabled才算真正生效。
三步写出可运行的WebSocket服务端
新建chat-server.php,粘贴以下代码:
① 实例化服务器:用$server = new Swoole\WebSocket\Server("0.0.0.0", 9502);监听所有网卡的9502端口;
② 处理连接:在on('open')回调里不做任何存储操作,只打印echo "fd={$request->fd} connected\n";——此时连接已建立,客户端可发消息;
③ 广播消息:在on('message')中调用foreach ($server->connections as $fd) { $server->push($fd, $frame->data); },把收到的原始消息原样推给所有人。
保存后执行php chat-server.php,终端出现START字样即启动成功。
前端直连测试页面(无需构建工具)
方法一:本地HTML文件直连
新建test-chat.html,写入基础WebSocket连接逻辑:
<script>const ws = new WebSocket("ws://localhost:9502");ws.onopen = () => ws.send("Hi from browser");ws.onmessage = e => console.log("←", e.data);</script>
用Chrome直接双击打开该文件,F12看Console——只要没报Connection refused,就说明服务端和浏览器链路已通。
方法二:跨域调试时强制指定IP
若服务部署在远程服务器,把ws://localhost:9502换成ws://你的服务器公网IP:9502,并确保服务器防火墙放行9502端口。
【Nginx反向代理未配置时,绝对不要用域名访问】 浏览器会因CORS拦截WebSocket握手,直接报错且无明确提示。
让消息带上发送者标识
修改服务端on('open')回调,从URL参数提取用户身份:
$uid = $request->get['uid'] ?? 'guest_' . $request->fd;$server->connections_info[$request->fd] = ['uid' => $uid];
再改on('message')里的广播逻辑:
$sender = $server->connections_info[$frame->fd]['uid'] ?? 'unknown';$msg = "[{$sender}]: {$frame->data}";foreach ($server->connections as $fd) { $server->push($fd, $msg); }
前端连接时带上uid参数:new WebSocket("ws://localhost:9502?uid=张三"),消息就会显示“[张三]: 你好”。
守护进程与异常退出处理
用nohup php chat-server.php > /dev/null 2>&1 &后台运行服务,但这种方式无法自动拉起崩溃进程。
更稳妥的做法是用Supervisor管理:
创建/etc/supervisor/conf.d/chat-server.conf,内容为:
[program:chat-server]command=php /path/to/chat-server.phpautostart=trueautorestart=trueuser=www-data
执行supervisorctl reread && supervisorctl update && supervisorctl start chat-server,服务即纳入进程守护体系。


















