Laravel Задание Cron Scheduler не выполняется должным образом - PullRequest
1 голос
/ 23 января 2020

У меня Laravel проблема cron. В Console Kernel я определил задание, которое будет нажимать на Rollovercron. php файл каждые 10 минут, и каждый раз, когда он будет попадать, он будет проходить одну страну. По крайней мере 100 стран определены в массиве и будут передаваться по очереди в Rollovercron. php в соответствии с foreach l oop. Rollovercron. php Для запуска одной страны требуется не менее 2 часов.

У меня несколько проблем с этим заданием cron:

  1. 100 элементов в массиве не получаются Один за другим означает, что я вижу, что страна «GH» (Гана) работает 5 раз непрерывно, и многие страны пропускаются.

  2. всякий раз, когда я получаю пропущенную страну, я делаю это composer часто обновляйте и очищайте кеш.

Я хочу, чтобы мой cron работал без перебоев и выбирал все страны, которые не должна пропустить ни одна страна, и мне не нужно делать composer обновление для это все время.

Пожалуйста, помогите мне в этом, борясь за это много месяцев.

ниже - Ядро. php файл:

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;

use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

use DB; 

class Kernel

extends ConsoleKernel

{  


/**

* The Artisan commands provided by your application.

*

* @var array

*/

protected $commands = [

\App\Console\Commands\preAlert::class,

\App\Console\Commands\blCron::class,

\App\Console\Commands\mainRollover::class,

\App\Console\Commands\refilingSync::class,

\App\Console\Commands\TestCommand::class,

\App\Console\Commands\rollOverCron::class,

\App\Console\Commands\FrontPageRedis::class,

\App\Console\Commands\filingStatusRejectionQueue::class,

\App\Console\Commands\VesselDashboardRedis::class,

\App\Console\Commands\Bookingcountupdate::class,

//   \App\Console\Commands\Voyagetwovisit::class,

];

/**

* Define the application's command schedule.

*

* @param  \Illuminate\Console\Scheduling\Schedule  $schedule

* @return void

*/

protected function schedule(Schedule $schedule)

{


$countrylist=array('NL','AR','CL','EC','DE','PH','ID','TT','JM','KR','BE','VN','US','BR','CM','MG','ZA','MU','RU','DO','GT','HN','SV', 'PR','SN', 'TN', 'SI','CI','CR','GM','GN','GY','HR','LC','LR','MR','UY','KH','BD','TH','JP','MM','AT','IE','CH','LB','PY','KE','YT','TZ','MZ','NA','GQ','ME');


foreach ($countrylist as $country) { 

$schedule->command('rollOverCron:send ' . $country)

->everyTenMinutes()

->withoutOverlapping();



}

foreach ($countrylist as $country) { 

$schedule->command('mainRollover:send ' . $country)

->daily()

->withoutOverlapping();



}

$schedule->command('filingStatusRejectionQueue')

->hourly()

->withoutOverlapping();





$schedule->command('Bookingcountupdate')

->everyTenMinutes()

->withoutOverlapping();






$schedule->command('preAlert')

->hourly()

->withoutOverlapping();




}
protected function commands()

{

require base_path('routes/console.php');

}

}



/**

* Register the Closure based commands for the application.

*
* @return void

*/

1 Ответ

0 голосов
/ 23 января 2020

Laravel планирование, знание того, как это работает, помогает, поэтому вы можете отлаживать его, когда он не работает, как ожидалось. Это включает погружение в источник.

Вы вызываете команду в планировщике, это возвращает событие .
Давайте проверим, как Laravel решает, что определяет перекрытие , мы видим, что срок его действия истекает через 1440 минут, или 24 часа .
Так что через один день, если запланированные элементы не запускаются, эти запланированные элементы просто перестают быть запланированными. Мы видим, что здесь используется мьютекс . Посмотрим откуда это. Кажется, это предусмотрено в конструкторе .
Итак, давайте посмотрим, какой мьютекс предоставляется. В функциях exe c и call используется мьютекс, определенный в конструкторе Scheduler . Используемый мьютекс - это интерфейс, вероятно, используемый как Фасад, и реальная реализация наиболее вероятна в CacheSchedulingMutex , который создает идентификатор мьютекса с использованием mutexName из события и текущего времени в часах и минутах.
Глядя на mutexName , мы видим, что идентификатор существует из выражения и команды вместе взятых.

Подводя итог, все события Вызванный в одной функции планировщика, используйте тот же мьютекс, который используется при проверке, не перекрываются ли вызовы методов, но мьютекс генерирует уникальный идентификатор для каждой команды, включая различные параметры, и на основе времени.

Срок выполнения запланированных заданий истечет через 24 часа, а это значит, что при выполнении заданий, занимающих 2 часа, вы получите около 12 заданий в день. Больше, если рабочие места небольшие, меньше, если работа занимает больше времени. Это потому, что PHP является однопоточным процессом по умолчанию. Первое задание 1, затем задание 2, затем задание 3. Et c ... Это означает, что если для каждого задания требуется 2 часа, то после 12 заданий срок их заданий в очереди истекает, поскольку задание выполняется в течение 1440 минут, а затем новый задания планируются и запускаются снова сверху.

К счастью, есть способ убедиться, что они запускаются одновременно .

Я предлагаю добавить ->runInBackground() к вашему планирование звонков.

$schedule->command('rollOverCron:send ' . $country)
        ->everyTenMinutes()
        ->withoutOverlapping()
        ->runInBackground()
        ->emailOutputTo(['ext.amourya@cma-cgm.com','EXT.KKURANKAR@cma-cgm.com']);cgm.com']);
    }
...