1

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?

JanBoehmer
  • 395
  • 3
  • 14

1 Answers1

1

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.

Snapey
  • 3,604
  • 1
  • 21
  • 19
  • Your setup is working but not to the final end. I can't set a `* * * * *` cron line in the hosting UI, but there is a drop down for "every X minutes" and I can provide a 1. I now added a `info("Test");` in `app/Console/Kernel.php` to see, if it gets fired and it does. But the actual scheduled command does not get fired. I have `$schedule->command('test:run')->withoutOverlapping();` and in the job I have a second log that does not get printed. When I run `php scheduler.php` in the command line, then it I see both logs. Any idea? – JanBoehmer Nov 01 '22 at 19:27
  • 1
    you may need to change it from a command to a direct call to the class containing the action you want to perform. $schedule-.command is probably trying to spawn a new thread. – Snapey Nov 02 '22 at 09:36