I am using the Laravel 5.7 and now I am facing the following problem: I have a cronjobs table which contains many cronjob records. Let's take one for example:
Record one should be repeated every 50 minutes
.
I created function getMinutelyCronjobs
fetches from DB all the cronjobs whish has to be executed minutely.
I went this way: I created a class in Commands Minutely.php
where I get all this cronjobs in the handle()
function. When I initialized all the data in Minutely.php
class, I cann call this handle()
function using $schedule->command('cronjobs:minutely')->everyMinute();
.
The problem is, that every cronjob could have different minute_x
(recurrence, in my example 50
) and then the $schedule->command('cronjobs:minutely')->everyMinute();
should be $schedule->command('cronjobs:minutely')->everyMinute(50);
.
here is my getMinutelyCronjobs
function :
public static function getMinutelyCronjobs(){
$fields = ['id', 'protocol', 'script', 'minutes_frequency', 'login_user', 'login_password', 'email'];
return Cronjob::select($fields)->where('minutely', 1)
->orderBy('id', 'desc')
->get();
}
How could I implement this ? Thank you for your help.
If you can get by with running the task every hour instead of every 50 minutes, the first answer will work. If you need it to be specifically every 50 minutes, you can try something like this, which should run every 50 minutes instead of every 60.
EDIT: You didn't give the details about the data you are pulling from your database relating to the jobs, but you should be able to just do something like this to schedule each job.
foreach ($jobs as $job) {
$schedule->command($job->command)->everyMinute()->when(function () {
$now = new \DateTime;
$minutes = floatval($now->format('G'))*60 + floatval($now->format('i'));
return $minutes % $job->minutes == 0;
});
}
everyMinute()
instead of use hourlyAt()
method
Run the task every hour at 50 mins past the hour
$schedule->command('cronjobs:minutely')->hourlyAt(50);
for more information read this article