Skip to content

Laravel Crontab 支持的最小单位是分钟,怎么实现秒级执行的需求呢?

「这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

需求描述

今天接到一个需求,每三秒钟给客户端推送一次最新的在线人数。

分析

每三秒钟?要这么频繁吗?之前的最小颗粒度是每分钟哇。

调研了一波发现,我们可以结合异步任务的delay来实现。

核心代码

在 onQueue()函数后面调用 delay()函数

delay指定了延迟多久执行

php
XxxxxJob::dispatch()     ->onQueue(QueueNameBuilder::getName(QueueNameBuilder::PUSH_DATING_COUNT))     ->delay(now()->addSeconds($delay));

需求实现

比如我们的需求是,每三秒钟给客户端推送一次数据。

我的设计是这样的:

异步任务代码

php
<?php namespace App\Console\Crontab; use App\Jobs\PushDatingCountJob; use App\Model\House\HouseOpen; use App\Model\Queue\QueueNameBuilder; class PushDatingCount extends BaseCrontab {     const RATE_SECOND = 3; //每三秒发送一次 延迟实现     public function __invoke()     {         $times = 60 / self::RATE_SECOND;         $delayTimes = [];         for ($i = 0; $i < $times; $i++) {             $delayTimes[] = $i * 3;         }         foreach ($delayTimes as $delay) {             PushDatingCountJob::dispatch()                 ->onQueue(QueueNameBuilder::getName(QueueNameBuilder::PUSH_DATING_COUNT))                 ->delay(now()->addSeconds($delay));         }     } }

Kernel

php
<?php namespace App\Console; . . . class Kernel extends ConsoleKernel {     /**      * The Artisan commands provided by your application.      *      * @var array      */     protected