作者PHP小志(专注PHP后端开发)

为什么需要这个组合?

  • AI接口耗时:图像生成/文本分析常需5-10秒,直接调用导致用户等待;
  • 服务器压力:高并发时容易崩溃;
  • 解决方案ThinkPHP队列 + 宝塔守护进程,实现异步处理+自动重启。

核心配置步骤

1. 宝塔守护进程配置

  1. 安装插件:宝塔面板 → 软件商店 → 安装「进程守护管理器」;
  2. 添加任务
    • 名称:ai_queue
    • 启动用户:www
    • 运行目录:/www/wwwroot/your_project
    • 启动命令:php think queue:listen --queue=ai_queue

⚠️ 确保PHP版本与站点一致,启用proc_open函数。


2. ThinkPHP队列配置(以TP6为例)

配置文件 config/queue.php

return [
 'default' => 'ai_queue',
 'connections' => [
  'ai_queue' => [
   'driver' => 'redis',
   'queue' => 'default',
   'retry' => 3,
   'timeout' => 600,
  ],
 ],
];

任务类示例(AI图片生成)

namespace app\job;

use think\queue\Job;
use app\service\AI\ImageService;

class AIImageGenerateJob
{
 public function fire(Job $job, $data)
 {
  try {
   $service = new ImageService();
   $result = $service->generate($data['image_path']);
   // 保存结果到数据库
   $job->delete(); // 标记任务完成
  } catch (\Exception $e) {
   if ($job->attempts() < 3) {
    $job->release(5); // 5秒后重试
   } else {
    $job->delete(); // 失败记录
   }
  }
 }
}

3. API接口调用队列

public function generateImage()
{
 $image = request()->file('image');
 $path = $image->move('uploads');
 
 Queue::push(new AIImageGenerateJob([
  'image_path' => $path,
  'user_id' => auth()->id()
 ]), 'ai_queue');
 
 return json(['task_id' => $job->getJobId(), 'status' => 'processing']);
}

实际效果对比

指标未使用队列使用队列+守护进程
用户等待时间5-10秒<1秒
服务器CPU峰值100%40-60%
同时处理能力5-10请求50+请求

常见问题

  1. 守护进程启动失败

    • 检查proc_open是否被禁用(宝塔PHP设置中取消禁用);
    • 确保PHP路径正确(执行which php查看)。
  2. 队列任务不执行

    • 检查队列驱动(推荐Redis);
    • 确认宝塔守护进程已启动。

补充建议

  • 监控队列状态:在宝塔计划任务中设置定时脚本,检查队列积压;
  • 失败任务处理:配置failed_jobs表,记录失败原因;
  • 扩展性:多实例部署时,使用Redis统一队列管理。

作者:PHP小志
首发于:个人技术博客


点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部