使用 WebSocket 实现实时通讯和消息推送,可以通过 ThinkPHP 框架提供的 Swoole 扩展来实现。
首先需要在配置文件中开启 Swoole:
// config/swoole.php
return [
'enable' => true,
'server' => [
'host' => '0.0.0.0',
'port' => 9501,
'mode' => SWOOLE_PROCESS,
'sock_type' => SWOOLE_SOCK_TCP,
'settings' => [
'worker_num' => swoole_cpu_num(),
'pid_file' => app()->getRuntimePath() . 'swoole.pid',
],
],
'sockets' => [
\app\socket\WebSocket::class,
],
];
这里开启了一个 host 为 0.0.0.0、port 为 9501 的 TCP 服务器,并且指定了一个 WebSocket 类进行处理。
然后创建 WebSocket 控制器类,例如 app\socket\WebSocket.php
:
namespace app\socket;
use think\swoole\Websocket;
use Swoole\Coroutine\Http\Client;
class WebSocket extends Websocket
{
public function onOpen($server, $request)
{
// 建立连接时触发
}
public function onMessage($server, $frame)
{
// 收到消息时触发
// 广播消息给所有客户端
$server->push('hello!');
}
public function onClose($server, $fd)
{
// 关闭连接时触发
}
}
在 onOpen
方法中,我们可以做一些连接建立后的初始化操作;在 onMessage
方法中,我们可以处理客户端发送的消息,并广播给其他客户端;在 onClose
方法中,我们可以做一些连接关闭后的清理工作。
最后,在路由配置文件中定义 WebSocket 的访问路径:
// route/websocket.php
use think\facade\Route;
Route::get('/websocket', 'socket/WebSocket/index');
现在就可以通过访问 /websocket
路径来访问 WebSocket 服务器了。在前端中,可以使用 JavaScript 的 WebSocket API 来连接服务器:
const ws = new WebSocket('ws://localhost:9501/websocket');
ws.onopen = function() {
console.log('connect success');
};
ws.onmessage = function(event) {
console.log('receive message:', event.data);
};
ws.onclose = function() {
console.log('disconnect');
};
这样就可以实现与 ThinkPHP 框架下的 WebSocket 服务器进行实时通讯和消息推送了。