phplaravelcronlaravel-scheduler

How to use the Laravel Scheduler on shared hosting?


My hoster technically allows cronjob but with the limitation to php files.

There is no way to access the crontab from a console.

I can set it up in the administration UI only and I need to provide a path to a php file. My ssh user has now access to the crontab. php artisan commands are working.

How can I set the recommended * * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1 in a php file? Or more strict: How can I run php artisan schedule:run >> /dev/null 2>&1 from a php file, so that I can provide this file to the administration UI?


Solution

  • So on the basis that you can only execute a php script in the particular cron setup of your host;

    You can create a file as follows to only run the schedule:run artisan command;

    #!/usr/bin/env php
    <?php
    
    define('LARAVEL_START', microtime(true));
    
    /*
    |--------------------------------------------------------------------------
    | Register The Auto Loader
    |--------------------------------------------------------------------------
    |
    | Composer provides a convenient, automatically generated class loader
    | for our application. We just need to utilize it! We'll require it
    | into the script here so that we do not have to worry about the
    | loading of any of our classes manually. It's great to relax.
    |
    */
    
    require __DIR__.'/vendor/autoload.php';
    
    $app = require_once __DIR__.'/bootstrap/app.php';
    
    /*
    |--------------------------------------------------------------------------
    | Run The Artisan Application
    |--------------------------------------------------------------------------
    |
    | When we run the console application, the current CLI command will be
    | executed in this console and the response sent back to a terminal
    | or another output device for the developers. Here goes nothing!
    |
    */
    
    $kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
    
    $input = new Symfony\Component\Console\Input\ArgvInput;
    
    $status = $kernel->call('schedule:run', [], new Symfony\Component\Console\Output\ConsoleOutput);
    
    /*
    |--------------------------------------------------------------------------
    | Shutdown The Application
    |--------------------------------------------------------------------------
    |
    | Once Artisan has finished running, we will fire off the shutdown events
    | so that any final work may be done by the application before we shut
    | down the process. This is the last thing to happen to the request.
    |
    */
    
    $kernel->terminate($input, $status);
    
    exit($status);
    
    

    This is adapted from the artisan file itself but removes the ability to specify anything other than schedule:run

    create this file as scheduler.php in the root of your project and then call this from your hosts cron setup with * * * * * as the time pattern (every minute). You might need to prefix it with the path to your project.