惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
Jina AI
Jina AI
The Cloudflare Blog
V
Visual Studio Blog
博客园_首页
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 【当耐特】
爱范儿
爱范儿
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
V
V2EX
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
T
Tailwind CSS Blog
博客园 - Franky

博客园 - zh7314

Go 1.23 → 1.26 升级检查文档 Pimcore 版本功能对比表(Community / Professional / Enterprise) typephp的编译核心phpx原理解析 typephp的编译原理 golang多版本控制工具支持Linux/macOS/Windows dbx低性能消耗的支持window/mac/docker的数据库客户端 关于headless和低代码平台的一些思考 docker日志监控dozzle,高性能,性能消耗小 pimcore 12版本的命令 阿里云 nas服务挂了导致docker挂载目录不存,docker无法重启和停止容器 symfony+swoole性能测试 关于小米手机使用 microsoft authenticator 无法扫码成功的解决方案 fastapi的构建cms,推荐fastapi集成框架 s3rius/FastAPI-template python 现代化包管理工具uv安装和使用 博文阅读密码验证 - 博客园 laravel在cli模式下输出格式漂亮一些 debug redis里面的lua脚本 laravel chunkById导出数据乱序问题 PHP 真正异步编程即将到来 首个 alpha 版本已经发布 (转) 关于his esb企业服务总线系统设计 多渠道订单,对应渠道公司的提现主体,如何设计系统 laravel 主表和从表一对一,从表是要多个选取最新的一条,性能优化 sourcetree无法获取远程所有的tag 支付宝沙盒模式商家转账经常出现 响应异常: 解包错误 laravel 使用异步队列,context带的上下文造成反序列化出问题 hyperf 的默认创建项目部署k8s docker缺失文件 在laravel使用注解自动注册 hyperf 查看所有路由的命令 线上就医全流程医药机构接入文档接口代码-医保就医接口php-demo版本 windows lm studio 0.3.8无法下载模型,更换镜像
laravel计划任务和异步队列任务,拆分成不同队列,减少计划任...
zh7314 · 2025-07-30 · via 博客园 - zh7314

2025年7月30日14:10:01

就直说laravel的计划任务,是串行化的一个一个执行的,如果当前需要执行的任务很多的时候,或者当前有任务的执行耗时比较长的时候,
那么一些需要及时处理的就会拖延,导致执行不及时,导致一些业务上的挤压数据。

一般的laravel 跑在fpm的执行计划任务的就是在linux的crontab上添加一条记录

// www 是php的运行用户,避免使用其他用户导致日志写入log导致权限问题
* * * * * sudo -u www /usr/local/php8/bin/php /data/wwwroot/mc/artisan schedule:run >> /data/root.log

laravel的另一个运行方式

php artisan schedule:work &   // 单独起一个进行跑计划任务

有人可能想到,如果为了方案1,执行任务拆分到不同的计划任务跑或者方案2,再起一个进行跑,但是这里就需要改造的东西很多,
方案1,需要涉及到很多改造
方案2,需要处理竞争锁的,处理数据需要原子性,保障多个计划任务的数据安全性

其实还有一个更好的拆分方案,

就是计划任务+异步任务队列,通过计划任务定时计划任务把异步任务抛到队列中(建议使用redis,队列数据很多,数据库压力增加,laravel做了竞争锁处理,可以跑多个)

根据不同业务把队列拆分成多个,这样耗时长的,需要及时执行就互不影响

class UploadJob implements ShouldQueue
{
    use Queueable;

    public int $orderId;

    /**
     * Create a new job instance.
     */
    public function __construct()
    {
        $this->onQueue('upload');
    }

    /**
     * Execute the job.
     */
    public function handle(): void
    {
    }
}

比如有个上传文件到某个地方,比较耗时,每个小时需要执行一次,但是有另一个任务需要计算钱,需要每5分钟扫描一次,这样每个小时的是简单点,就会计算的很慢,导致
计算钱的数据不及时,系统有些不好的表现

那么改造成:

class UploadCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'upload';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '上传脚本';

    /**
     * Execute the console command.
     */
    public function handle(): void
    {
        Log::withContext([RequestConst::TraceId => generateUuid('upload')]);
        // 逻辑伪代码
        $job = new UploadJob();
        $job->orderId = xxx;
        dispatch($job);
    }
}
启动2个队列
php artisan queue:listen --queue=upload --sleep=1 & php artisan queue:listen --queue=upload --sleep=1 & 

启动2个不同队列
php artisan queue:listen --queue=upload --sleep=1 & php artisan queue:listen --queue=doOrder --sleep=1 &