实时推送消息是现代 Web 应用程序中常见的一种需求,而 WebSocket 已成为实时通信的首选技术。ThinkPHP 提供了对 WebSocket 的支持,本文将演示如何使用 ThinkPHP 实现 WebSocket 实时推送消息的详细例子。
- 安装 Swoole
在开始之前,你需要先安装 Swoole 扩展。可以使用以下命令来安装:
pecl install swoole
如果没有安装 pecl 工具,可以使用下面的命令:
yum install php-pear -y
然后再次运行 pecl 安装命令。
- 初始化 ThinkPHP 项目
使用 Composer 创建一个空的 PHP 项目:
composer create-project topthink/think tp-websocket
进入项目的根目录:
cd tp-websocket
- 创建 WebSocket 控制器
在 ThinkPHP 中创建 WebSocket 控制器与创建 HTTP 控制器类似,只需要继承 \think\swoole\WebSocket 类即可。在控制器中,可以定义事件处理程序并处理客户端发送的消息。以下是一个简单的 WebSocket 控制器示例:
<?php
namespace app\index\controller;
use think\swoole\WebSocket;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
class Chat extends WebSocket
{
/**
* WebSocket 建立连接时对应的事件处理函数
* @param Request $request
*/
public function onOpen(Request $request)
{
echo "new client connected\n";
}
/**
* WebSocket 接受消息时对应的事件处理函数
* @param Frame $frame
*/
public function onMessage(Frame $frame)
{
var_dump($frame->data);
}
/**
* WebSocket 断开连接时对应的事件处理函数
* @param Request $request
*/
public function onClose($fd)
{
echo "client {$fd} closed\n";
}
}
在此示例中,我们定义了三个事件处理程序:
- onOpen(): 当 WebSocket 连接被建立成功时,会触发该事件,我们可以在该事件处理程序中实现一些初始化操作,例如记录日志、发送欢迎消息等。
- onMessage(): 当客户端发送消息时,会触发该事件,我们可以在该事件处理程序中处理客户端发送的消息。
- onClose(): 当 WebSocket 连接被关闭时,会触发该事件,我们可以在该事件处理程序中释放资源、记录日志等。
- 配置 WebSocket 服务器
在 ThinkPHP 中,WebSocket 服务器的配置与 HTTP 服务器的配置类似,在应用程序的 config 目录下创建一个 websocket.php 文件,并添加以下配置:
<?php
return [
'server' => [
'host' => '0.0.0.0',
'port' => 9502,
'worker_num' => 2,
'daemonize' => false,
'pid_file' => runtime_path() . 'swoole.pid',
'log_file' => runtime_path() . 'swoole.log',
],
'websocket' => [
'enable' => true,
'handler' => app\index\controller\Chat::class,
],
];
在此示例中,我们定义了以下配置项:
- host: WebSocket 服务器的监听地址。
- port: WebSocket 服务器的监听端口。
- worker_num: 指定 worker 进程数量。
- daemonize: 是否以守护进程的方式运行。
- pid_file: 后台进程的 PID 文件路径。
- log_file: 日志文件路径。
- websocket.enable: 是否启用 WebSocket 服务。
- websocket.handler: WebSocket 请求处理器的类名。
- 启动 WebSocket 服务器
我们需要在控制台中启动 WebSocket 服务器,可以使用以下命令:
php think swoole start
启动成功后,WebSocket 服务器将在指定的地址和端口上监听客户端的连接。
- 测试 WebSocket 服务
现在,我们可以使用任何支持 WebSocket 的客户端来测试我们的 WebSocket 服务器。可以使用浏览器的开发者工具或者 Postman 等工具来发送 WebSocket 消息。
假设我们的 WebSocket 服务器监听在 9502 端口,我们可以使用以下 JavaScript 代码在浏览器中连接 WebSocket 服务器并发送消息:
var ws = new WebSocket('ws://localhost:9502');
ws.onopen = function() {
console.log('WebSocket opened');
ws.send('Hello, WebSocket!');
}
ws.onmessage = function(event) {
console.log(`Received message: ${event.data}`);
}
ws.onclose = function() {
console.log('WebSocket closed');
}
在浏览器的控制台中,你将看到类似以下的输出:
WebSocket opened
Received message: Hello, WebSocket!
到此,我们已经成功实现了一个简单的 WebSocket 实时推送消息的例子。你可以根据自己的需求扩展 WebSocket 控制器,并在该控制器中处理 WebSocket 事件。