拉拉维尔每分钟命令都不起作用


Laravel command every minute doesn't work

编辑:@Bogdan,脚本只执行了一次,正好是第二天开始前一个小时,这很奇怪,也是因为当天两个约会的start时间不同。然而,这两项约会都定于第二天进行。

所以基本上我的脚本没有检查下一个小时内即将到来的约会,而只是检查明天的约会,并在约会开始前一小时发送电子邮件。混乱。另外,如果以Y-m-d H:i格式检查时间,秒数是否无关紧要?还是我错过了什么?

操作:

我使用 laravel cronjob 和调度程序设置了一些命令。我已经得到了我需要工作的所有命令,除了一个。我有一个约会数据库,我在其中存储约会到期时的时间戳。使用命令,我想在约会到期前一小时发送电子邮件。为此,我使用以下命令:

$schedule->command('appointment:hourly')->everyMinute();

所以它每分钟运行一次。在我的命令中,我有以下内容:

$date = Carbon::now()->addHours('1')->format('Y-m-d H:i');
$appointments = Appointment::latest('start')->date($date)->get();

因此,它将日期设置为 now() ,然后添加一个小时并在数据库中检查该值。我的电子邮件永远不会发送(电子邮件脚本有效,因为我对其他命令使用相同的脚本)。

我也尝试了以下方法:

$date = Carbon::now()->addHours('1')->format('Y-m-d H:i:s');

还是没有。我的日期存储在数据库中,例如:

2016-01-25 09:00:00

因此,无论它是否也检查以匹配秒数,它应该可以工作。例如,当我在视图中检查我的$date时,它确实返回2016-01-25 09:00

任何指示将不胜感激。

顺便说一句,我的date()功能。它只是根据start列检查值:

public function scopeDate($query, $date)
{
    if($date)
    {
        return $query->whereDate('start', '=', $date);
    }
    else {
        return false;
    }
}

附言。我应该提到一件事。昨晚 11:00 整,我收到了来自上述命令的两封电子邮件,说约会将在一小时内开始。这些约会原定于今天开始,但未设置为在 00:00 开始。所以我想使用上面的命令,它不会检查今天的约会。我很困惑,还不能弄清楚这一点。

这里有两件事需要考虑:

1.确保在config/app.php文件中设置了正确的时区,因为这可能是在错误的时间发送约会通知电子邮件的原因。

2. 从 cron 作业运行到执行 Carbon::now() 语句,时间可能不完全是你期望的(这不是确定的,可能会受到代码执行时的行为和/或服务器负载的影响)。所以时间可能是09:00:01而不是09:00:00,在这种情况下,你的条件将不再真实(这是它偶尔起作用的另一个原因)。

为了确保时差不会影响条件,您应该检查时间是否比当前时间短一小时或更短,这当然需要您设置某种标记,让您知道通知是否已发送。此外,由于whereDate仅比较日期和时间字符串的日期部分,因此还需要处理检查时间。由于 Eloquent 没有为此提供任何方法,因此您可以将 hourminute MySQL 函数与whereRaw结合使用,如下所示:

$date = Carbon::now()->addHours('1');
$query->where('notified', false)
      ->whereDate('start', '=', $date->format('Y-m-d'))
      ->whereRaw('hour(start) <= ?', [$date->format('H')])
      ->whereRaw('minute(start) <= ?', [$date->format('i')]);