CRON JOB-为不同时区安排Laravel命令-为不同地区管理



我使用的是Laravel 5.8,我喜欢自动生成发票。发票应在周一至周日自动生成。每周日晚上23:59:00

假设我有

"23:59:00根据地区时区"。

每个商店都与一个地区有关,从地区表中可以找到时区。

问题我应该如何设置CRON JOB,以便根据我将从表中获得的时区列表自动生成发票?。

我有两个建议;

如果希望它是静态的,请在数据库中用相应的时区定义每个命令。不同的时区可能具有相同的时间,例如Europe/AmsterdamEurope/Berlin

$schedule->command('generate:report')->timezone('one-of-the-timezone')->at('23:59');
$schedule->command('generate:report')->timezone('another-timezone')->at('23:59');
$schedule->command('generate:report')->timezone('yet-another-timezone')->at('23:59');
$schedule->command('generate:report')->timezone('some-other-timezone')->at('23:59');

如果你希望它是动态的,让它每59次运行一次。min,并尝试使用hour将其与时区相匹配。

$schedule->command('generate:report')->hourlyAt(59);

在您的命令类中;

public function handle(TimezoneRepository $timezoneRepository)
{
$timezones = $timezoneRepository->getUniqueTimezones(); // the unique timezones in your database - cache if you want
foreach ($timezones as $timezone) {
$date = Carbon::now($timezone); // Carbon::now('Europe/Moscow'), Carbon::now('Europe/Amsterdam') etc..
if ($date->hour === 23) { // you are in that timezone
$currentTimezone = $date->getTimezone();
dispatch(new ReportMaker($currentTimezone)); // dispatch your report maker job
}
}
}

对于动态的,您将在一次迭代中(当执行generate:report时(命中多个时区,正如我在开始时所说的那样。

  • 其中一个可能的缺陷可能是;如果获取时区等的执行时间超过1分钟,您可能在00:00而不是23:59。最好异步计算报表并缓存时区列表,以免在执行此循环时遇到问题。

  • 另一个可能的缺陷;

根据维基;

一些区域偏移了30或45分钟(例如,纽芬兰标准时间为UTC−03:30,尼泊尔标准时间为UTC+05:45,印度标准时间为UTC+05:30,缅甸标准时间为usc+06:30(。

如果你想涵盖其中的任何一个,那么最好执行像这样的命令

$schedule->command('generate:report')->cron('14,29,44,59 * * * *');

并进行小时和分钟的比较,例如;

$date->hour === 23 && $date->hour === 59

您可以在任务Schedulelding 中使用timezone((方法

使用时区方法,您可以指定计划任务时间应该在给定的时区内解释:

$schedule->command('report:generate')
->timezone('America/New_York')
->at('02:00')

最新更新