I am not sure why cron doesn't for Laravel artisan commands. But when I launch it manually like php artisan my:command it works.
I have put command in Kernel:
protected function schedule(Schedule $schedule)
{
$schedule->command('my:command')->everyMinute();
}
Also when I run php artisan schedule:run it says: No scheduled commands are ready to run.
Crontab looks like this:
* * * * * php /project/artisan schedule:run
At first I thought maybe cron itself doesn't work, but it executes php files not related to artisan.
I am using PHP7 if it changes anything.
UPDATED (cron artisan commands work, but schedule dont)
Cron command works (log has been saved in storage/app folder)
* * * * * php /project/artisan command:test
Cron schedule doesn't work
* * * * * php /project/artisan schedule:run
test.php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Storage;
use Carbon\Carbon;
class test extends Command
{
protected $signature = 'command:test';
protected $description = 'Command description';
public function __construct()
{
parent::__construct();
}
public function handle()
{
Storage::prepend('test.log', Carbon::now());
}
}
Kernel.php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected $commands = [
Commands\test::class,
];
protected function schedule(Schedule $schedule)
{
$schedule->command('command:test')->everyMinute();
}
}
Related
I have the following Kernel.php:
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* Define the application's command schedule.
*
* #param \Illuminate\Console\Scheduling\Schedule $schedule
* #return void
*/
protected function schedule(Schedule $schedule)
{
\Log::info("hit");
$schedule->command('queue:restart')->everyFiveMinutes();
$schedule->command('queue:work')->name('queue_work_name')->withoutOverlapping()->runInBackground();
}
}
and a cron job set to run every minute... it prints correctly the "hit" in the logs, but no sign of the queue to be running... however, if i go to the terminal and run php artisan queue:work --once, it just works fine
What am i missing
Have you added this code to crontab?
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
Above code checks for the scheduled commands and executes them.
To open crontab in linux use crontab -e.
Laravel version 5.7, PHP version 7.2 running on Apache2
The command in my crontab is as follows:
* * * * * php /var/www/dev-site/artisan schedule:run >> /dev/null 2>&1
My kernel is as follows:
<?php
namespace App\Console;
use App\Console\Commands\ImportInvoiceBatch;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected $commands = [
ImportInvoiceBatch::class,
];
protected function schedule(Schedule $schedule)
{
$schedule->command('import:invoice-batch')->everyMinute()->withoutOverlapping();
}
protected function commands()
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}
Running my defined command as "php artisan import:invoice-batch" works correctly, and even running "php artisan schedule:run" recognizes everything and runs the task as expected, but the scheduler is not being executed ever minute as should be happening. Is there anything I am missing? Thanks in advance.
Try to change working directory to app root before running artisan:
* * * * * cd /var/www/dev-site/artisan && php artisan schedule:run >> /dev/null 2>&1
Also you could try to add output path for debuging:
* * * * * cd /var/www/dev-site/artisan && php artisan schedule:run >> /var/log/crontab/artisan.log 2>&1
This question already has an answer here:
Command schedule in Laravel
(1 answer)
Closed 5 years ago.
I have a problem with laravel command
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Illuminate\Foundation\Bus\DispatchesJobs;
class Kernel extends ConsoleKernel
{
use DispatchesJobs;
protected $commands = [
Commands\checkDeposits::class,
];
protected function schedule(Schedule $schedule)
{
$schedule->command('check:deposits')->everyFiveMinutes();
}
}
The command is not executed every five minutes ...
Its not executed at all. If i use php artisan check:deposits it works.
Why the command is not scheduled to run every 5 minutes ?
Also tried php artisan schedule:run
output : No scheduled commands are ready to run.
Add the following line to the crontab of your server:
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
This will execute the Laravel command scheduler every minute.
Also, include the class of your command in Kernel.php (case sensitive):
use Commands\CheckDeposits;
And include it in the $commands array:
protected $commands = [
CheckDeposits::class,
];
I have set a cron job
* * * * * php /var/www/html/laravel schedule:run 1>> /var/www/html/log_laravel 2>&1
This is what I have set in app\console\Kernel.php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use App\Http\Controllers\DataController;
class Kernel extends ConsoleKernel
{
protected $commands = [
];
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
DataController::get_data();
})->everyMinute();
}
}
Is that it? In docs there isn't anything else but this is not working.
DataController#get_data should perfom some updates in database (I can also call this manually by going to http//www.site.com/public/data/get_data. How can I debug this? I don't have anything in log file in storage/logs and my log_laravel for Cron job is empty.
You need to reference the path to artisan.php script:
* * * * * php /var/www/html/laravel/artisan schedule:run 1>> /var/www/html/log_laravel 2>&1
I do not recommend writing output to any logs, this will run every minute, and will kill your disk space.
I have statusUpdate.php file in the
xampp\htdocs\project\app\Console\Commands folder.
statusUpdate.php :
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use DB;
class statusUpdate extends Command
{
/**
* The name and signature of the console command.
*
* #var string
*/
protected $signature = 'status:update';
/**
* The console command description.
*
* #var string
*/
protected $description = 'Update Job status daily';
/**
* Create a new command instance.
*
* #return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* #return mixed
*/
public function handle()
{
$affected = DB::table('jobs')->update(array('status' => 1));
}
}
It is created by the following Laravel official documentation.
Then I was added \App\Console\Commands\statusUpdate::class, class in Kernel.php on xampp\htdocs\project\app\Console folder.
Here is the karnel.php file code:
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* #var array
*/
protected $commands = [
\App\Console\Commands\statusUpdate::class,
];
/**
* Define the application's command schedule.
*
* #param \Illuminate\Console\Scheduling\Schedule $schedule
* #return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('status:update')
->everyFiveMinutes();
}
}
Then I was run
php artisan schedule:run command using CMD on windows 7.
Now it is working fine(in local server). My jobs table status field is updated properly by 1.
But when I was deployed this project on the shared hosting and added a CRON command for my server in cPanel:
Cron job command is like this : php /path/to/artisan schedule:run 1>> /dev/null 2>&1
Now in this case command not working & this is the problem. how can I solve it?
Well. I am giving you the answer as per what you have said.
Cron job command is like this : php /path/to/artisan schedule:run 1>> /dev/null 2>&1
The path should be locating the artisan file in the server. Like this:
Let's say your artisan file location is /var/www/artisan, then the simple answer could be do like this:
php /var/www/artisan schedule:run 1>> /dev/null 2>&1
Just check if that works. Thank You!
UPDATE:
This is how it should look like.
This worked fine for me
/usr/local/bin/php /path/to/artisan schedule:run >> /dev/null 2>&1
You should add the command from the cPanel server as
/usr/local/bin/php /home/xyz/public_html/artisan schedule:run 1>> /home/xyz/public_html/log_laravel 2>&1
This will keep all the logs in /home/xyz/public_html/log_laravel
Running scheduled command: '/opt/cpanel/ea-php71/root/usr/bin/php' 'artisan' SyncAPIOrders:orders > '/dev/null' 2>&1
In my case cron Job was not working, if you are about to schedule the command as once a day (i.e., 00:00) iff, same time is not reflected in a $schedule->command(); object
If the commands were incorrect, I used to get this warning in my Email as
PHP Warning: Module 'magickwand' already loaded in Unknown on line 0
Status: 404 Not Found
X-Powered-By: PHP/5.6.37
Content-type: text/html; charset=UTF-8
No input file specified.
In Kernel.php you should specify
/**
* Define the application's command schedule.
*
* #param \Illuminate\Console\Scheduling\Schedule $schedule
* #return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('SyncAPIOrders:orders')
->timezone('Asia/Kolkata')
->dailyAt('00:00');
}