0

0

Laravel如何处理长耗时任务_Laravel配置Supervisor进程管理监控队列【指南】

尼克

尼克

发布时间:2026-01-07 12:58:02

|

884人浏览过

|

来源于php中文网

原创

Laravel通过队列异步处理长耗时任务,禁止在控制器中同步执行;需封装为可中断、可重试、可监控的Job类,配合Supervisor守护worker进程,并合理配置max-jobs、max-time、重试机制与队列分发策略。

laravel如何处理长耗时任务_laravel配置supervisor进程管理监控队列【指南】

Laravel 本身不直接“处理”长耗时任务,而是通过 queue 将其异步移交到后台工作进程;Supervisor 不是 Laravel 内置组件,它只是 Linux 上稳定守护 php artisan queue:work 进程的通用工具——用错位置或配置不当,队列照样卡死、任务丢失、内存爆满。

为什么不能直接在控制器里跑 sleep(300) 或大循环?

PHP-FPM 进程会阻塞,Web 请求超时(Nginx 默认 60s,Apache 类似),用户看到 504;同时数据库连接可能被回收、日志写入中断、异常无法被捕获上报。真正要跑的不是“代码”,是“可中断、可重试、可监控”的队列任务。

必须把耗时逻辑封装进 App\Jobs\YourLongRunningJob,然后用 dispatch() 推进队列:

use App\Jobs\ProcessMonthlyReport;
ProcessMonthlyReport::dispatch($userId)->onQueue('reports');

关键点:

  • onQueue('reports') 显式指定队列名,避免所有任务挤在 default 队列导致优先级混乱
  • Job 类里不要用 $this->user = auth()->user() 这类运行时依赖——序列化时会失败;改用传 ID,handle() 中再查
  • 避免在 __construct() 中做 DB 查询或 HTTP 请求,只存原始参数

queue:work 进程为什么总自己退出?

常见原因不是代码报错,而是 Supervisor 配置没关掉自动重启策略,或 Laravel 的 QUEUE_WORKER_MAX_JOBS / QUEUE_WORKER_MAX_TIME 触发了优雅退出。默认 php artisan queue:work 每处理 250 个任务或运行 60 分钟就会退出——这是防止内存泄漏的保护机制,不是 bug。

Supervisor 需显式配置为“自动拉起退出的进程”,且禁用 autostart=false 以外的干扰项:

火山翻译
火山翻译

火山翻译,字节跳动旗下的机器翻译品牌,支持超过100种语种的免费在线翻译,并支持多种领域翻译

下载
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/your-app/artisan queue:work --queue=reports,default --sleep=3 --tries=3 --max-jobs=250 --max-time=3600
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/log/supervisor/worker.log

注意:

  • --max-jobs=250--max-time=3600 要和 Laravel 的 config/queue.phpoptions 里的值对齐,否则 supervisor 看不到进程退出原因
  • numprocs=2 表示起两个独立 worker,但它们共享同一个 --queue=reports,default,Laravel 内部会轮询分发,不是手动负载均衡
  • 别漏掉 --sleep=3:空闲时每 3 秒轮询一次 Redis/DB,太小加重 IO,太大响应延迟

Redis 队列爆满、任务堆积、retry 堆成山怎么办?

先看 redis-cli -a yourpass llen queues:default,如果数字持续 > 1000,说明消费跟不上生产。不是加 worker 数量就能解决——更可能是单个任务执行太久(比如一个 PDF 生成要 80 秒),堵住整个队列。

排查路径:

  • php artisan queue:failed 查失败任务,重点看 exception 字段是否含 TimeoutExceptionPDOException: Lost connection
  • 检查任务中是否有同步 HTTP 调用(file_get_contentscurl_exec)没设超时,应强制加 timeout=10
  • DB 查询是否缺索引?DB::listen() 记录慢查询,>500ms 的必须优化
  • 避免在 job 中调 sleep() 等待外部结果——改用「状态轮询 + delayed dispatch」模式

例如第三方 API 返回 processing 状态,就不要 while 循环等,而应 dispatch 自己带 delay:

if ($status === 'processing') {
    self::dispatch($jobId)->delay(now()->addSeconds(30));
}

Supervisor 只管进程不死,不管任务逻辑是否合理;队列积压本质是业务节奏和 worker 吞吐不匹配,或是任务设计违反了异步原则。最常被忽略的一点:没有给每个关键 job 加 public $tries = 3;public $backoff = 60;,导致失败后立即重试,雪崩式打垮下游服务。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2243

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1489

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1391

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

951

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1413

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1233

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1444

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1303

2023.11.13

C++ 高性能计算与并行编程
C++ 高性能计算与并行编程

本专题专注于 C++ 在高性能计算(HPC)与并行编程中的应用,涵盖多线程、并发数据处理、OpenMP、MPI、GPU加速等技术。通过实际案例,帮助开发者掌握 如何利用 C++ 进行大规模数据计算和并行处理,提高程序的执行效率,适应高性能计算与数据密集型应用场景。

5

2026.01.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.4万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号