laravel 随机时间安排命令

alb*_*ini 5 random laravel laravel-scheduler

我有一个奇怪的问题。我使用自定义命令通过 FB api 共享一些 url。

现在这个命令被安排到一个固定的 cron 配置,但我希望它是随机的,也许在时间范围之间。

我尝试在命令中使用随机睡眠函数,但出现了奇怪的行为。

有人已经不得不面对这个问题了吗?

Zan*_*per 8

一种解决方案是将要运行的代码放入队列作业中,然后将该作业延迟随机量。例如,此代码将在每小时的随机时间运行(同样可以轻松地推断为每天或其他时间间隔的随机时间):

$schedule
  ->call(function () {
    $job = new SomeQueuedJob();
    // Do it at some random time in the next hour.
    $job->delay(rand(0, 60 * 59));
    dispatch($job);
  })
  ->hourly();
Run Code Online (Sandbox Code Playgroud)


小智 4

您可以在开始时生成随机时间。

protected function schedule(Schedule $schedule)
{
    $expressionKey = 'schedule:expressions:inspire';
    $expression = Cache::get($expressionKey);
    if (!$expression) {
        $randomMinute = random_int(0, 59);

        // hour between 8:00 and 19:00
        $hourRange = range(8, 19);
        shuffle($hourRange);
        // execute twice a day
        $randomHours = array_slice($hourRange, 0, 2);

        $expression = $randomMinute . ' ' . implode(',', $randomHours) . ' * * *';
        Cache::put($expressionKey, $expression, Carbon::now()->endOfDay());
    }

    $schedule->command('inspire')->cron($expression);
}
Run Code Online (Sandbox Code Playgroud)