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.
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
I have setup a command that generates a PDF with some stats and it sends the pdf as an attachment in an email. The command works great when I run t manually in my console.
php artisan send:report
Now I am trying to setup that this command is executed every last day of the month. To test I have setup the scheduler to everyMinute but when I run php artisan schedule:run the email is sent only 1 time when I run the command and not every minute.
Am I doing something wrong here?
My Kernel.php file in Lumen
<?php
namespace App\Console;
use App\Console\Commands\SendReport;
use Illuminate\Console\Scheduling\Schedule;
use Laravel\Lumen\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* #var array
*/
protected $commands = [
SendReport::class,
];
/**
* Define the application's command schedule.
*
* #param \Illuminate\Console\Scheduling\Schedule $schedule
* #return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('report:send')->everyMinute();
}
}
Am I missing something ?
Any help is greatly appreciated !
Many thanks in advance !
Please ensure this is on your server Cron entries as described in the docs
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
I think you need to set the entry in the crontab. See here: https://laravel.com/docs/5.4/scheduling and scroll down to Starting The Scheduler.
Need to add a cronjob to run the schedule:run command:
Found answer in this issue.
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();
}
}
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');
}