Редактировать:
@ Богдан, скрипт выполнялся только один раз, то есть ровно за час до того, как начался бы следующий день, что странно, также потому, что start
Время обоих назначений в этот день было разным. Оба назначения, однако, были назначены на следующий день.
Так что в основном мой сценарий не проверял предстоящие встречи в течение следующего часа, а просто назначал встречи на завтра и отправлял электронное письмо за час до дня, когда эти встречи начнутся. Смешение. Кроме того, не имеют значения секунды, если время проверяется в формате Y-m-d H:i
? Или я что-то упустил?
OP:
У меня есть несколько команд, настроенных с помощью cronjob и планировщика laravel. У меня есть все команды, которые мне нужны, кроме одной. У меня есть база данных встреч, где я храню метку времени, когда назначена встреча. Используя команду, я хочу отправить электронное письмо за час до назначенной встречи. Для этого я использую следующую команду:
$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;
}
}
PS. Я должен упомянуть одну вещь. Прошлой ночью, ровно в 23:00, я получил два письма от вышеупомянутой команды, в которых говорилось, что встреча должна была начаться через час. Это были встречи, которые должны были начаться на сегодняшний день, но они не должны были начинаться в 00:00. Так что, думаю, с помощью приведенной выше команды, она не проверяет назначения на сегодня. Я запутался и пока не смог понять это.
Здесь нужно учитывать две вещи:
1. Убедитесь, что в вашем часовом поясе установлен правильный часовой пояс. config/app.php
файл, поскольку это может быть причиной того, что электронное письмо с уведомлением о встрече было отправлено в неправильное время.
2. С момента выполнения задания cron до Carbon::now()
оператор выполняется, время может быть не совсем таким, как вы ожидаете (это не является определенным и может зависеть от того, что делает ваш код и / или от загрузки сервера во время выполнения). Так что время может быть 09:00:01
вместо 09:00:00
, в этом случае ваше состояние больше не будет истинным (это еще одна причина, почему оно работает спорадически).
Чтобы убедиться, что разница во времени не влияет на состояние, вы должны проверить, если время один час или меньше с текущего времени, это, конечно, потребует от вас установить какой-то маркер это позволяет узнать, было ли отправлено уведомление. Также с whereDate
сравнивает только часть даты строки даты и времени, также необходимо проверять время. Поскольку Eloquent не предлагает никаких методов для этого, вы можете использовать hour
а также 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')]);
Других решений пока нет …