Простыми словами: когда демон CRON вызывает команду php artisan schedule: run каждую минуту, ядро консоли будет загружено, а задания, определенные вами в вашем методе App\Console\Kernel::schedule()
, будут зарегистрированы впланировщик.
Метод schedule()
принимает в качестве единственного аргумента экземпляр Illuminate\Console\Scheduling\Schedule
, это диспетчер расписания, используемый для записи заданий, которые вы ему даете, и решает, что должно выполняться каждый раз, когда демон CRON проверяет его.
Теперь переходим к вашей проблеме.
as @ hoseinz3 Упомянуто почти правильно
Как Laravel предотвращает перекрытие запланированных заданий?
Иногда выполнение запланированного задания занимает больше времени, чемто, что мы изначально ожидали, и это вызывает запуск другого экземпляра задания, пока первый еще не завершен, например, представьте, что мы запускаем задание, которое генерирует отчет каждую минуту, через некоторое время, когда данные становятся большими, генерация отчета можетзаймет больше 1 минуты, поэтому другой экземпляр этой работы запускается, пока первая еще не завершена.
В большинстве сценариев это нормально, но иногда это следует предотвращать, чтобы гарантировать правильность данных или предотвращать большие ресурсы сервера.потребление.
Laravel проверит свойство класса Console \ Scheduling \ Event :: withoutOverlapping и, если оно установлено в true, попытается создать мьютекс для задания и будет запускать его только при созданиимьютекс был возможен.
Подробнее о Мьютекс
Таким образом, Laravel создает мьютекс, когда задание запускается в первый раз, а затем каждый раз, когда задание запускается, проверяет, существует ли мьютекс, и запускает задание только в том случае, если его нет.
Таким образом, Laravel создаетметод обратного вызова фильтра, который инструктирует Диспетчер расписания игнорировать задачу, если мьютекс все еще существует, он также создает обратный вызов, который очищает мьютекс после выполнения экземпляра задачи.
Попробуйте этот фрагмент
<?php
namespace App\Console;
use App;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel {
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
//
'\App\Console\Commands\GetNewsUpdates',
'\App\Console\Commands\AddBirthdayNotifications',
'\App\Console\Commands\DeleteBirthdayNotifications',
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule) {
// ---------- Birthday Notification at Daily at 15:00 --------------------
$schedule->command('AddBirthdayNotifications:addbdaynotifications')
->dailyAt('23:45')
->withoutOverlapping(60);
// ---------- Delete Birthday Notification at Daily at 23:30 -------------
$schedule->command('DeleteBirthdayNotifications:deletebdaynotifications')
->dailyAt('23:30')
->withoutOverlapping(60);
/*
Get News At every 4 Hours Daily
*/
if (App::environment('live')) {
$schedule->command('GetNewsUpdates:getnews')
->cron('0 */4 * * *')
->withoutOverlapping(100)
->pingBefore("") //This will alert if something fails
->thenPing("")
->appendOutputTo('output.log');
}
// ----------- Delete Send Emails at weekly -------------------
$schedule->command('DeleteSendEmails:deleteEmailsSend')
->weekly()
->withoutOverlapping(60);
// ----------- Send Emails at Daily at 6:00 --------------------
$schedule->command('SendEmails:sendEmailToUser')
->dailyAt('6:00')
->withoutOverlapping()
->appendOutputTo('/root/logs/Emails_output.log');
// ------------ Bulk user email scheduling Run Daily at 9:30 According to America time .... -----------------
$schedule->command('ConnectSendEmails:sendEmailToConnectUser')
->timezone('America/New_York')
->dailyAt('9:30')
->withoutOverlapping()
->appendOutputTo('/root/logs/BulkEmails_output.log');
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands() {
$this->load(__DIR__ . '/Commands');
require base_path('routes/console.php');
}
}
Попробуйте какую-нибудь систему CRON Job Monitoring.Вы можете попробовать очевидца, который является очень хорошим инструментом для мониторинга Laravel Application .