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):
composer require 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";
}
}
?>
这个类处理连接、消息接收和关闭事件,实现了基本的群聊广播功能。
4. 前端连接 WebSocket 测试
使用浏览器前端 JavaScript 连接 Swoole 提供的 WebSocket 服务:
确保服务器 IP 可访问,并开放 9502 端口。
5. 启动服务
在命令行运行:
php think swoole start该命令会启动 Swoole 服务并监听 WebSocket 连接。
基本上就这些。你可以在此基础上扩展私聊、房间、用户认证等功能,比如通过 fd 关联用户 ID,使用 Redis 存储在线状态等。关键点是利用 Swoole 的长连接能力弥补 HTTP 的不足,让 ThinkPHP 支持真正的实时通信。不复杂但容易忽略的是防火墙和跨域问题,部署时需注意。











