Skip to content

Instantly share code, notes, and snippets.

@project24retry
Forked from robbydooo/RunScheduler.php
Created December 13, 2017 01:52
Show Gist options
  • Select an option

  • Save project24retry/d42a3f93cee9c065daca4e25120968ba to your computer and use it in GitHub Desktop.

Select an option

Save project24retry/d42a3f93cee9c065daca4e25120968ba to your computer and use it in GitHub Desktop.

Revisions

  1. @robbydooo robbydooo revised this gist Mar 8, 2017. 1 changed file with 0 additions and 2 deletions.
    2 changes: 0 additions & 2 deletions RunScheduler.php
    Original file line number Diff line number Diff line change
    @@ -2,7 +2,6 @@

    /**
    Author: Rob Norman <robbydooo@gmail >
    This Scheduler will run once every minute unlike the Heroku scheduler which only runs every 10 mintues.
    @@ -32,7 +31,6 @@
    use Illuminate\Support\Facades\Artisan;

    /**
    * author: Robert Norman <[email protected]>
    *
    * 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
  2. @robbydooo robbydooo created this gist Mar 8, 2017.
    110 changes: 110 additions & 0 deletions RunScheduler.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,110 @@
    <?php

    /**
    Author: Rob Norman <robbydooo@gmail >
    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;

    /**
    * author: Robert Norman <[email protected]>
    *
    * 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;
    }
    }