Lumen task scheduling everyMinute isn't working? - php

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.

Related

Laravel queue works only if started manually, not with Kernel command

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.

Cron job runs and stops mysteriously?

I have a cron set on ubuntu to run some Laravel scheduled commands. It's running sometimes and stopping at random times. last week it did not run the commands for the whole week, the it started to run again yesterday. This morning it stopped again. I have tried everything but nothing seems to be solving the issue. What am i missing?
Here is the cron:
*/15 * * * * ubuntu cd /var/www/html && php artisan schedule:run >> /dev/null 2>&1
And Here is my Kernel.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\TrackData::class,
];
/**
* Define the application's command schedule.
*
* #param \Illuminate\Console\Scheduling\Schedule $schedule
* #return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('data:track')->withoutOverlapping()
->everyFifteenMinutes()->appendOutputTo(storage_path().'/logs/laravel_output.log');
$schedule->command('queue:listen')->withoutOverlapping()
->everyFifteenMinutes()->appendOutputTo(storage_path().'/logs/laravel_output.log');
$schedule->command('delete:oldxml')->withoutOverlapping()
->dailyAt('00:01');
// $schedule->command('sitemap:generate')
// ->daily();
}
/**
* Register the commands for the application.
*
* #return void
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}
I've tried everything but nothing seems to solve the problem. What am i missing
it might be many reasons for this kind of problem where your crontab suddenly stopped working.
it might be related to crontab user. to solve the problem, you can try to delete all crontabs for both root and other users.
You can catch the script error into a log file for better investigation as following.
*/15 * * * * ubuntu cd /var/www/html && php artisan schedule:run >> /tmp/script.log 2>&1
it might be related to the PHP config. Your script may run longer than your php.ini's max_execution_time and also check set_time_limit()
You can check cron log by using this command tail -fn 100 /var/log/cron
it might occur due to script file permission and ownership of script files. so make sure you give proper permission to the script file.
chmod +x yourscript.sh chown root:root yourscript.sh
it might be related to OS. Maybe your webserver disk is full or an OS that can't spawn new threads.
Maybe your script has begun to overlap themselves and */15 * * * * is not enough. you can try to increase time to */30 * * * *

Set schedule cron job in Laravel

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.

Cron job running every time whenever i run the artisan command

I have a task scheduled to run an artisan command, and whenever i run artisan command it is executing every time irrespective of time i have given to the cron job.
Here is the console i'm using
class CronJobConsole extends Command
{
/**
* The name and signature of the console command.
*
* #var string
*/
protected $signature = 'sms:note';
/**
* The console command description.
*
* #var string
*/
protected $description = 'Command description';
/**
* Create a new command instance.
*
* #return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* #return mixed
*/
public function handle()
{
//executing function;
}
$this->info('Remainder SMS send successfully !!');
}
}
and this is my console/kernel.php file
class Kernel extends ConsoleKernel
{
protected $commands = [
\App\Console\Commands\Inspire::class,
\App\Console\Commands\FileEntryData::class,
\App\Console\Commands\CronJobConsole::class,
];
/**
* Define the application's command schedule.
*
* #param \Illuminate\Console\Scheduling\Schedule $schedule
* #return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('sms:note')->dailyAt('19:00')->sendOutputTo('cronjob-result.php');
}
}
when i run the php artisan sms:note it is executing every time. I want it to execute on particular time that i have gven.
Please help me out.
This problem, as you specify it, is just artisan's normal behaviour.
You have scheduled the command, so it will be executed on the specified time driven by Laravels internal scheduler (read below cronjob). But you can also manually execute the command, by entering it in CLI.
Note: executing your command manually has nothing to do with artisan's scheduler. The scheduler only executes this command whenever you see fit.
So the command you are looking for is:
php artisan schedule:run
This commands loops through the registered commands on the specified time, so it will only run your command when the time is ready.
To make sure Laravel executes your command when it's time, create a cronjob (on your server) to run the php artisan schedule:run command every minute, Laravel takes care of the rest.
From the docs (insert in crontab):
* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
Goodluck!

How to run artisan command schedule:run on hosting server? (Laravel)

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');
}

Categories