Fastadmin中使用think-queue队列

在Fastadmin中使用think-queue队列笔记

目录

安装依赖包

队列配置

生产端

消费端

运行队列

守护进程

[安装 supervisor](#安装 supervisor)

配置文件

重启supervisor生效

总结


安装依赖包

命令如下:

bash 复制代码
composer require topthink/think-queue

若存在则不需要安装

队列配置

队列配置默认使用redis,配置文件位于application/extra/queue.php。

代码如下:

php 复制代码
<?php
return [
    'connector'  => 'Redis',          // Redis 驱动
    'expire'     => 0,             // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null
    'default'    => 'default',    // 默认的队列名称
    'host'       => '127.0.0.1',       // redis 主机ip
    'port'       => 6379,        // redis 端口
    'password'   => '',             // redis 密码
    'select'     => 0,          // 使用哪一个 db,默认为 db0
    'timeout'    => 0,          // redis连接的超时时间
    'persistent' => false,
];

生产端

在业务处理逻辑中对一些耗时的操作,添加到队列中进行异步处理。

代码如下:

php 复制代码
// 添加到队列,只传递必要参数
\think\Queue::push('app\common\job\VideoProcessJob', [
       trends_id'     => $this->model->id,
       'text'         => $this->user['nickname']
], 'video');

消费端

在application/common下创建job文件夹,创建消费队列文件VideoProcessJob.php,

在生产端添加队列后,在消费端进行处理(需要注意不要重复消费)。

代码如下:

php 复制代码
<?php

namespace app\common\job;

use think\queue\Job;
use app\common\library\VideoHandler;
use app\common\model\Trends;

class VideoProcessJob
{
    /**
     * 视频处理任务
     */
    public function fire(Job $job, $data)
    {
        try {
            // 查询帖子信息
            $TrendsModel = new Trends();
            $trends = $TrendsModel->where('id', $data['trends_id'])->find();
            if (!$trends) {
                throw new \think\Exception('帖子不存在');
            }

            echo "帖子ID: " . $trends['id'] . "\n";
            echo "帖子标题: " . $trends['title'] . "\n";
            
            // 获取视频列表
            $videos = explode(',', $trends['video_list']);
            if (empty($videos)) {
                throw new \think\Exception('视频列表为空');
            }

            // 是否队列处理
            if ($trends['is_queue']) {
                // 队列处理,直接删除任务
                $job->delete();
            }
            
            $videoHandler = new VideoHandler();
            
            // 处理每个视频
            $waterImages = [];
            $insert = [];
            foreach ($videos as $video) {
                $videoPath = ROOT_PATH . 'public' . $video;
                $waterFilename = str_replace('.mp4', '_w.mp4', $video);
                
                // 同时处理压缩和文字水印
                $compressOptions = [
                    'resolution' => '1280x720',
                    'bitrate' => '800k',
                    'fps' => 24
                ];
                $watermarkText = $data['text'] . ' @ ' . date('Y');
                $watermarkOptions = ['position' => 'bottom-right'];
                
                $videoHandler->compressWithWatermark(
                    $videoPath,
                    ROOT_PATH . 'public' . $waterFilename,
                    $compressOptions,
                    $watermarkText,
                    $watermarkOptions
                );
                $waterImages[] = $waterFilename;
                $insert[] = ['path' => $video, 'created_at' => time()];
            }

            // 修改帖子视频字段
            $TrendsModel->where('id', $trends['id'])->update([
                'video_list' => implode(',', $waterImages),
                'is_queue'   => 1
            ]);
            

            // 任务执行成功,删除任务
            $job->delete();
            
        } catch (\think\Exception $e) {
            // 记录错误日志
            \think\Log::error('视频处理任务失败: ' . $e->getMessage());
            echo "错误信息: " . $e->getMessage() . "\n";
            
            // 重试3次
            if ($job->attempts() < 3) {
                $job->release(60); // 60秒后重试
            } else {
                $job->delete(); // 超过重试次数,删除任务
            }
        }
    }
}

运行队列

在命令行开启队列监听,并分配进行处理。

命令如下:

bash 复制代码
# 基础命令(常驻进程,持续监听队列)
php think queue:work

# 指定队列名称(如处理名为 "order" 的队列)
php think queue:work --queue order

# 限制进程数/处理次数(新手可选)
php think queue:work --daemon --tries 3  

# --daemon 常驻模式(6.x 可省略,默认常驻),--tries 失败重试次数

执行如下:

守护进程

在生产环境中可以使用supervisor对队列进行托管。

防止因进程意外退出导致队列停摆。

安装 supervisor
bash 复制代码
#以 CentOS 为例:
yum install supervisor
systemctl enable supervisor
systemctl start supervisor
配置文件
bash 复制代码
[program:think_queue]
command=php /你的项目根目录/think queue:work --queue order --tries 3
autostart=true
autorestart=true
user=www  # 运行用户,建议和 web 服务一致
redirect_stderr=true
stdout_logfile=/var/log/think_queue.log  # 日志文件
重启supervisor生效
bash 复制代码
supervisorctl reload
supervisorctl status  # 查看进程状态

总结

在Fastadmin中使用think-queue队列笔记

相关推荐
门思科技9 小时前
LoRaWAN 设备类别:Class A、B、C 对比与选型指南
c语言·开发语言·php
甲骨文数据库20 小时前
caddy配合PHP(http模式)
php
啊阿狸不会拉杆20 小时前
《计算机网络-自顶向下方法》1.7 计算机网络和因特网的历史 读书笔记
计算机网络·php·perl
智塑未来1 天前
常用的在线ping测试工具有哪些
服务器·开发语言·php
啊阿狸不会拉杆1 天前
《计算机网络-自顶向下方法》1.3 网络核心 读书笔记
网络·人工智能·计算机网络·ai·php
171320330计算机毕设编程1 天前
2027计算机毕设五大方向对比&选题推荐
java·ide·python·算法·django·php·推荐算法
IT小白杨1 天前
TikTok小店防封号浏览器实战:2026年多店铺环境隔离与账号安全运营技术解析
开发语言·数据库·安全·php·chrome devtools·指纹浏览器
catchadmin1 天前
免费可商用 PHP 管理后台 CatchAdmin V5.4.0 发布,新增短信服务能力
开发语言·php
Tanshu_API君1 天前
身份证实名认证接口对接:PHP 接入二要素核验实战
php·api·实名认证·身份证实名认证·身份认证接口·运营商接口·运营商二要素
啊阿狸不会拉杆1 天前
《计算机网络-自顶向下方法》1.5 协议层次及其服务模型 读书笔记
开发语言·计算机网络·php