作者:PHP小志(专注PHP后端开发)为什么需要这个组合?
- AI接口耗时:图像生成/文本分析常需5-10秒,直接调用导致用户等待;
- 服务器压力:高并发时容易崩溃;
- 解决方案:ThinkPHP队列 + 宝塔守护进程,实现异步处理+自动重启。
核心配置步骤
1. 宝塔守护进程配置
- 安装插件:宝塔面板 → 软件商店 → 安装「进程守护管理器」;
- 添加任务:
- 名称:
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+请求 |
常见问题
守护进程启动失败
- 检查
proc_open是否被禁用(宝塔PHP设置中取消禁用); - 确保PHP路径正确(执行
which php查看)。
- 检查
队列任务不执行
- 检查队列驱动(推荐Redis);
- 确认宝塔守护进程已启动。
补充建议
- 监控队列状态:在宝塔计划任务中设置定时脚本,检查队列积压;
- 失败任务处理:配置
failed_jobs表,记录失败原因; - 扩展性:多实例部署时,使用Redis统一队列管理。
作者:PHP小志
首发于:个人技术博客

发表评论 取消回复