-
-
Save robbydooo/65bf341ea0f4081150b945bfb1d38d3c to your computer and use it in GitHub Desktop.
<?php | |
/** | |
This Scheduler will run once every minute unlike the Heroku scheduler which only runs every 10 mintues. | |
To use this scheduler with Laravel 5.4+ add this file to /app/Console/Commands/RunScheduler.php | |
Register this file in app/Console/Kernel.php | |
protected $commands = [ | |
... | |
Commands\RunScheduler::class | |
... | |
] | |
Add this line to your Procfile: | |
scheduler: php -d memory_limit=512M artisan schedule:cron | |
Push to Heroku and you will see you have a new dyno option called Scheduler, start ONE only. | |
I highly recommend using Artisan::queue to run your cron jobs so that your scheduler does not over run. | |
*/ | |
namespace App\Console\Commands; | |
use Illuminate\Console\Command; | |
use Carbon\Carbon; | |
use Illuminate\Support\Facades\Artisan; | |
/** | |
* | |
* Runs the scheduler every 60 seconds as expected to be done by cron. | |
* This will break if jobs exceed 60 seconds so you should make sure all scheduled jobs are queued | |
* | |
* Class RunScheduler | |
* @package App\Console\Commands | |
*/ | |
class RunScheduler extends Command | |
{ | |
/** | |
* The name and signature of the console command. | |
* | |
* @var string | |
*/ | |
protected $signature = 'schedule:cron {--queue}'; | |
/** | |
* The console command description. | |
* | |
* @var string | |
*/ | |
protected $description = 'Run the scheduler without cron (For use with Heroku etc)'; | |
/** | |
* Create a new command instance. | |
* | |
* @return void | |
*/ | |
public function __construct() | |
{ | |
parent::__construct(); | |
} | |
/** | |
* Execute the console command. | |
* | |
* @return mixed | |
*/ | |
public function handle() | |
{ | |
$this->info('Waiting '. $this->nextMinute(). ' for next run of scheduler'); | |
sleep($this->nextMinute()); | |
$this->runScheduler(); | |
} | |
/** | |
* Main recurring loop function. | |
* Runs the scheduler every minute. | |
* If the --queue flag is provided it will run the scheduler as a queue job. | |
* Prevents overruns of cron jobs but does mean you need to have capacity to run the scheduler | |
* in your queue within 60 seconds. | |
* | |
*/ | |
protected function runScheduler() | |
{ | |
$fn = $this->option('queue') ? 'queue' : 'call'; | |
$this->info('Running scheduler'); | |
Artisan::$fn('schedule:run'); | |
$this->info('completed, sleeping..'); | |
sleep($this->nextMinute()); | |
$this->runScheduler(); | |
} | |
/** | |
* Works out seconds until the next minute starts; | |
* | |
* @return int | |
*/ | |
protected function nextMinute() | |
{ | |
$current = Carbon::now(); | |
return 60 -$current->second; | |
} | |
} |
Hi, so how am i gonna use this? i have my own schedulers. how do i use your code for my schedulers. Im a newbie btw
Sorry i completely missed this message. Hopefully you have figured it out by now :-).
See my message here for full details https://stackoverflow.com/questions/35151297/how-to-setup-laravel-5s-task-scheduling-in-heroku/42682908?noredirect=1#comment80872368_42682908
Thank's for this solution! It works like a charm!
For future users, I really recommend using {--queue } in your Procfile.
And for Heroku users, don't forget about active your resource in the Heroku Dashboard ^^
Thank's again @robbydooo !
is this work on Heroku free dynos?
anyone know how to adding worker:run to the scheduler?
I do not believe you can on free dynos, although it has been a long time since I last used this code sorry.
I do not believe you can on free dynos, although it has been a long time since I last used this code sorry.
i've been tried it on free dynos. it works.
nice!
I'm completely new to schedulers so I'm somewhat confused on how to implement this and run my scheduled tasks at the Kernel.php
of my code. Do I have to move them from the Kernel@schedule
to the RunScheduler@runScheduler
function or do I just need to call something to run my tasks at the Kernel.php
? Also, what does the Artisan::$fn('schedule:run');
does?
Hi, so how am i gonna use this? i have my own schedulers. how do i use your code for my schedulers. Im a newbie btw