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