ThinkPHP实现即时通讯需借助Swoole扩展,通过配置swoole.php启用WebSocket服务,编写事件处理类实现消息广播,并以前端JavaScript连接ws://ip:9502完成实时通信。
ThinkPHP 结合 WebSocket 实现即时通讯,核心在于使用 Swoole 或 Workerman 扩展来支持长连接通信,因为原生的 ThinkPHP(基于 HTTP 短连接)无法直接处理 WebSocket。下面以 Swoole 为例,说明如何在 ThinkPHP 中实现简单的即时通讯功能。
1. 环境准备与扩展安装
确保你的服务器环境已安装 PHP 并支持 Swoole 扩展:安装 Swoole:通过 pecl 安装swoole扩展(建议版本 4.5+)
使用 Composer 安装 ThinkPHP 对 Swoole 的支持(适用于 ThinkPHP 6):composerrequire topthink/think-swoole配置 .env 文件或 config/swoole.
php启用 WebSocket 服务2. 配置 WebSocket 服务在 ThinkPHP 的配置目录下创建或修改config/swoole.php:return ['server' => ['host' => '0.0.0.0','port' => 9502,'mode' => SWOOLE_PROCESS,'type' => SWOOLE_SOCK_TCP,],'websocket' => true, // 开启 WebSocket 支持];?>这将启用 Swoole 的 WebSocket 模式,监听 9502 端口。
立即学习“PHP免费学习笔记(深入)
”;
3. 编写 WebSocket 事件处理逻辑在 app 目录下创建 WebSocket 服务类,例如app/listener/WebSocketListener.php:namespace app\listener;use think\swoole\contract\websocket\HandlerInterface;use think\swoole\Websocket;class WebSocketListener implements HandlerInterface{public function onOpen(\$server, \$request){echo "客户端 {$request->fd} 已连接\n";}public function onMessage(\$server, \$frame){// 接收客户端消息\$data = \$frame->data;// 广播给所有在线用户foreach (\$server->connections as \$fd) {if (\$server->isEstablished(\$fd)) {\$server->push(\$fd, "用户 {\$frame->fd} 说:{\$data}");}}}public function onClose(\$server, \$fd){echo "客户端 {$fd} 已断开\n";}}?>这个类处理连接、消息接收和关闭事件,实现了基本的群聊广播功能。
Comet AI 浏览器下载 Comet AI 浏览器,体验由 Perplexity AI 驱动的革命性上网方式。内置 AI 助手可实时总结网页、跨标签页对比信息、自动执行任务。告别繁琐操作,让 AI 成为你的浏览副驾,大幅提升研究与工作效率。支持 Windows、macOS、Android 和 iOS。
下载
4.
前端连接 WebSocket 测试使用浏览器前端 JavaScript 连接 Swoole 提供的 WebSocket 服务:确保服务器 IP 可访问,并开放 9502 端口。
5. 启动服务
在命令行运行:
php think swoole start该命令会启动 Swoole 服务并监听 WebSocket 连接。
基本上就这些。你可以在此基础上扩展私聊、房间、用户认证等功能,比如通过 fd 关联用户 ID,使用 Redis 存储在线状态等。关键点是利用 Swoole 的长连接能力弥补 HTTP 的不足,让 ThinkPHP 支持真正的实时通信。不复杂但容易忽略的是防火墙和跨域问题,部署时需注意。
