在该月的第一个工作日安排任务

时间:2017-10-04 08:12:39

标签: php laravel laravel-5.3

我目前有一项任务,从我的网站收集使用情况统计信息,并设置为自动通过电子邮件发送给客户端。

问题在于,本月的第一天可能是一个非工作日,我想这不是灾难,但看起来有点不专业。

这就是我目前的安排方式:

$schedule
    ->command("report", [ "--email" => "example@example.com" ]) //My command which accepts the email as a parameter
    ->monthly();

我正在考虑做以下事情:

$schedule
    ->command("report", [ "--email" => "example@example.com" ]) //My command which accepts the email as a parameter
    ->monthlyOn(1)
    ->when(function () {
         if (in_array(Carbon::now()->dayOfWeek,[Carbon::SATURDAY,Carbon::SUNDAY])) { 
            return false;  
        }
        return true;
    });

$schedule
    ->command("report", [ "--email" => "example@example.com" ]) //My command which accepts the email as a parameter
    ->monthlyOn(2)
    ->when(function () {
         if (Carbon::now()->dayOfWeek == Carbon::MONDAY) { 
            return true; //1st was in the weekend
        }
        return false;
    });    

$schedule
    ->command("report", [ "--email" => "example@example.com" ]) //My command which accepts the email as a parameter
    ->monthlyOn(3)
    ->when(function () {
         if (Carbon::now()->dayOfWeek == Carbon::MONDAY) { 
            return true; //1st and 2nd was in the weekend
        }
        return false;
    });     

然而,对于像这样简单的事情,这看起来很奇怪。

所以我的问题:

  1. 如果when条件失败,该任务是否会再次尝试,直到成功为止? (假设这是一个没有但不确定的)
  2. 是否有更简单的方法在本月的第一个工作日运行任务?

2 个答案:

答案 0 :(得分:1)

我会将此作为社区维基的答案发布给其他人,以便他们在将来需要时使用:

  

您可以将条件放入实际的crontab命令中:

[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"
  

现在,如果这样   你有一个月前七天的情况是正确的   第一个星期一。请注意,在crontab中,需要使用百分比语法   但是要逃脱:

0   12  1-7 *   *   [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"

以上引用自https://superuser.com/questions/428807/run-a-cron-job-on-the-first-monday-of-every-month

通过这种方式设置为cronjob,每周只运行一次。我相信这将是您实现目标的最有效方法。

答案 1 :(得分:0)

我知道接受的答案是正确的,但是,我总是有不同的方式更喜欢这个:

->monthlyOn(Carbon::parse('first monday of this month')->format('d'), '5:00')