Laravel 每分钟命令不起作用

Laravel command every minute doesn't work

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

所以基本上我的脚本不会检查下一小时即将到来的约会,而只是检查明天的约会,并在这些约会开始前一小时发送电子邮件。令人困惑。另外,如果以 Y-m-d H:i 格式检查时间,秒数不重要吗?还是我遗漏了什么?

OP:

我使用 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 时,它会 return 2016-01-25 09:00 例如。

任何指点将不胜感激。

顺便说一下,我的 date() 函数。它只是检查 start 列的值:

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

PS。我应该提一件事。昨晚正好 11:00 下午,我收到了两封来自上述命令的电子邮件,说约会将在一个小时后开始。这些约会定于今天开始,但并未设置为在 00:00 开始。所以我猜用上面的命令,它不会检查今天的约会。我很困惑,还没有弄明白。

这里有两点需要考虑:

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

2. 从 cron 作业运行到执行 Carbon::now() 语句,时间可能与您预期的不完全相同(这是不确定,并且可能会受到代码所做的影响 and/or 执行时服务器负载)。因此时间可能是 09:00:01 而不是 09:00:00,在这种情况下,您的条件将不再成立(这是它偶尔起作用的另一个原因)。

为确保时差不影响条件,您应该检查时间是否比当前时间一小时或更短,这当然需要您设置某种 标记 让您知道通知是否已发送。此外,由于 whereDate 仅比较日期和时间字符串的日期部分,因此还需要处理检查时间。由于 Eloquent 没有为此提供任何方法,您可以将 hour and minute 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')]);