我有一个奇怪的问题。 我使用自定义命令通过FB api分享一些网址。
现在这个命令被安排到一个固定的cron配置,但我希望它是随机的,可能在时间范围之间。
我尝试在命令中使用随机睡眠功能,但我的行为很奇怪。
有没有人必须面对这个问题?
答案 0 :(得分:1)
您可以在开始时生成随机时间。
protected function schedule(Schedule $schedule)
{
$expression = \Cache::get('schedule:expressions:inspire');
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('schedule:expressions:inspire', $expression, Carbon::now()->endOfDay());
}
$schedule->command('inspire')->cron($expression);
}
答案 1 :(得分:0)
一种解决方案是将要运行的代码放入“排队的作业”,然后将该作业随机延迟。例如,此代码将在每小时的随机时间运行(可以很容易地将其推断为每天或在其他时间间隔的随机时间):
$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();