thinkphp结合WebSocket 实时推送消息详细实例

本文介绍了如何在ThinkPHP项目中利用Swoole扩展创建WebSocket控制器,处理连接、消息接收和断开事件,实现Web应用程序的实时推送功能。
摘要由CSDN通过智能技术生成

实时推送消息是现代 Web 应用程序中常见的一种需求,而 WebSocket 已成为实时通信的首选技术。ThinkPHP 提供了对 WebSocket 的支持,本文将演示如何使用 ThinkPHP 实现 WebSocket 实时推送消息的详细例子。

  1. 安装 Swoole

在开始之前,你需要先安装 Swoole 扩展。可以使用以下命令来安装:

pecl install swoole

如果没有安装 pecl 工具,可以使用下面的命令:

yum install php-pear -y

然后再次运行 pecl 安装命令。

  1. 初始化 ThinkPHP 项目

使用 Composer 创建一个空的 PHP 项目:

composer create-project topthink/think tp-websocket

进入项目的根目录:

cd tp-websocket

  1. 创建 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 连接被关闭时,会触发该事件,我们可以在该事件处理程序中释放资源、记录日志等。
  1. 配置 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 请求处理器的类名。
  1. 启动 WebSocket 服务器

我们需要在控制台中启动 WebSocket 服务器,可以使用以下命令:

php think swoole start

启动成功后,WebSocket 服务器将在指定的地址和端口上监听客户端的连接。

  1. 测试 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 事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值