中原一点男 发表于 2024-8-15 16:12:47

PHP转Go系列 | ThinkPHP与Gin框架之打造基于WebSocket技术的消息推送中心

大家好,我是码农先森。
在早些年前客户端想要实时获取到最新消息,都是使用定时长轮询的方式,不断的从服务器上获取数据,这种粗暴的骚操作实属不雅。不过现如今我也还见有人还在一些场景下使用,比如在 PC 端扫描二维码,然后使用长轮询的方式从服务端获取最新的扫码信息,来判断用户是否已经扫码完成,诸如这种场景还有不少。其实大家都知道长轮询的方式不好,那为什么还有人使用呢?

我想最直接的原因就是「开发起来简单明了」,人性决定了人类都是趋易避难的高级物种,那个容易上手就用那个。但是我想表达的是除了长轮询的方式外,WebSocket 技术其实也不难,只不过对于从来没有接触过长连接的人来说,刚开始上手时会有一些思维上的障碍。这次我分享的内容是基于 WebSocket 技术的消息推送中心,看起来很高大上,其实也就是通过一些小的例子来演示,从服务端推送数据到客户端的这个过程,接下来的例子简单明了容易上手,我们赶紧开始吧。
话不多说,开整!我们先来看一下整体的项目目录结构,内容主要分为 PHP 和 Go 两部分。
$ tree -L 2
.
├── go_websocket
│   ├── app
│   │   ├── controller
│   │   |        |── message.go
│   │   │   └── websocket.go
│   │   └── route.go
│   ├── go.mod
│   ├── go.sum
│   └── main.go
└── php_websocket
│   ├── app
│   │   ├── controller
│   │   |        |── Push.php
│   │   │   └── Worker.php
│   ├── composer.json
│   ├── composer.lock
│   ├── config
│   │   |── worker_server.php
│   │   └── worker.php
│   ├── route
│   │   └── app.php
│   ├── think
│   ├── vendor
│   └── .envThinkPHP

使用 composer 创建基于 ThinkPHP 框架的 php_websocket 项目。
## 当前目录
$ pwd
/home/manongsen/workspace/php_to_go/php_websocket

## 安装 ThinkPHP 框架
$ composer create-project topthink/think php_websocket
$ cp .example.env .env

## 安装 Composer 依赖包
$ composer require topthink/think-worker
$ composer require predis/predis使用 php think make:controller Worker 命令创建 Worker.php 控制器。这个控制器中主要实现了 onWorkerStart 这个方法,首先添加了一个 Timer 异步定时器,然后从 Redis 队列中读取消息,最后将消息推送到客户端,这个定时器会每间隔一秒钟调度一次。
// ./php_to_go/php_websocket/app/controller/Worker.php
页: [1]
查看完整版本: PHP转Go系列 | ThinkPHP与Gin框架之打造基于WebSocket技术的消息推送中心