-
-
Save sisou/889971461616661d2ed6 to your computer and use it in GitHub Desktop.
<?php | |
# Cron job command for Laravel 4.2 | |
# Inspired by Laravel 5's new upcoming scheduler (https://laravel-news.com/2014/11/laravel-5-scheduler) | |
# | |
# Author: Soren Schwert (GitHub: sisou) | |
# | |
# Requirements: | |
# ============= | |
# PHP 5.4 | |
# Laravel 4.2 ? (not tested with 4.1 or below) | |
# A desire to put all application logic into version control | |
# | |
# Installation: | |
# ============= | |
# 1. Put this file into your app/commands/ directory and name it 'CronRunCommand.php'. | |
# 2. In your artisan.php file (found in app/start/), put this line: 'Artisan::add(new CronRunCommand);'. | |
# 3. On the server's command line, run 'php artisan cron:run'. If you see a message telling you the | |
# execution time, it works! | |
# 4. On your server, configure a cron job to call 'php-cli artisan cron:run >/dev/null 2>&1' and to | |
# run every five minutes (*/5 * * * *) | |
# 5. Observe your laravel.log file (found in app/storage/logs/) for messages starting with 'Cron'. | |
# | |
# Usage: | |
# ====== | |
# 1. Have a look at the example provided in the fire() function. | |
# 2. Have a look at the available schedules below (starting at line 132). | |
# 4. Code your schedule inside the fire() function. | |
# 3. Done. Now go push your cron logic into version control! | |
use Illuminate\Console\Command; | |
use Symfony\Component\Console\Input\InputOption; | |
use Symfony\Component\Console\Input\InputArgument; | |
class CronRunCommand extends Command { | |
/** | |
* The console command name. | |
* | |
* @var string | |
*/ | |
protected $name = 'cron:run'; | |
/** | |
* The console command description. | |
* | |
* @var string | |
*/ | |
protected $description = 'Run the scheduler'; | |
/** | |
* Current timestamp when command is called. | |
* | |
* @var integer | |
*/ | |
protected $timestamp; | |
/** | |
* Hold messages that get logged | |
* | |
* @var array | |
*/ | |
protected $messages = array(); | |
/** | |
* Specify the time of day that daily tasks get run | |
* | |
* @var string [HH:MM] | |
*/ | |
protected $runAt = '03:00'; | |
/** | |
* Create a new command instance. | |
* | |
* @return void | |
*/ | |
public function __construct() | |
{ | |
parent::__construct(); | |
$this->timestamp = time(); | |
} | |
/** | |
* Execute the console command. | |
* | |
* @return mixed | |
*/ | |
public function fire() | |
{ | |
/** | |
* EXAMPLES | |
*/ | |
// You can use any of the available schedules and pass it an anonymous function | |
$this->everyFiveMinutes(function() | |
{ | |
// In the function, you can use anything that you can use everywhere else in Laravel. | |
// Like models: | |
$affectedRows = User::where('logged_in', true)->update(array('logged_in' => false)); // Not really useful, but possible | |
// Or call artisan commands: | |
Artisan::call('auth:clear-reminders'); | |
// You can append messages to the cron log like so: | |
$this->messages[] = $affectedRows . ' users logged out'; | |
}); | |
// Another example: | |
// Send the admin an email every day | |
$this->dailyAt('09:00', function() | |
{ | |
// This uses the mailer class | |
Mail::send('hello', array(), function($message) | |
{ | |
$message->to('[email protected]', 'Cron Job')->subject('I am still running!'); | |
}); | |
}); | |
$this->finish(); | |
} | |
protected function finish() | |
{ | |
// Write execution time and messages to the log | |
$executionTime = round(((microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']) * 1000), 3); | |
Log::info('Cron: execution time: ' . $executionTime . ' | ' . implode(', ', $this->messages)); | |
} | |
/** | |
* AVAILABLE SCHEDULES | |
*/ | |
protected function everyFiveMinutes(callable $callback) | |
{ | |
if((int) date('i', $this->timestamp) % 5 === 0) call_user_func($callback); | |
} | |
protected function everyTenMinutes(callable $callback) | |
{ | |
if((int) date('i', $this->timestamp) % 10 === 0) call_user_func($callback); | |
} | |
protected function everyFifteenMinutes(callable $callback) | |
{ | |
if((int) date('i', $this->timestamp) % 15 === 0) call_user_func($callback); | |
} | |
protected function everyThirtyMinutes(callable $callback) | |
{ | |
if((int) date('i', $this->timestamp) % 30 === 0) call_user_func($callback); | |
} | |
/** | |
* Called every full hour | |
*/ | |
protected function hourly(callable $callback) | |
{ | |
if(date('i', $this->timestamp) === '00') call_user_func($callback); | |
} | |
/** | |
* Called every hour at the minute specified | |
* | |
* @param integer $minute | |
*/ | |
protected function hourlyAt($minute, callable $callback) | |
{ | |
if((int) date('i', $this->timestamp) === $minute) call_user_func($callback); | |
} | |
/** | |
* Called every day | |
*/ | |
protected function daily(callable $callback) | |
{ | |
if(date('H:i', $this->timestamp) === $this->runAt) call_user_func($callback); | |
} | |
/** | |
* Called every day at the 24h-format time specified | |
* | |
* @param string $time [HH:MM] | |
*/ | |
protected function dailyAt($time, callable $callback) | |
{ | |
if(date('H:i', $this->timestamp) === $time) call_user_func($callback); | |
} | |
/** | |
* Called every day at 12:00am and 12:00pm | |
*/ | |
protected function twiceDaily(callable $callback) | |
{ | |
if(date('h:i', $this->timestamp) === '12:00') call_user_func($callback); | |
} | |
/** | |
* Called every weekday | |
*/ | |
protected function weekdays(callable $callback) | |
{ | |
$days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']; | |
if(in_array(date('D', $this->timestamp), $days) && date('H:i', $this->timestamp) === $this->runAt) call_user_func($callback); | |
} | |
protected function mondays(callable $callback) | |
{ | |
if(date('D', $this->timestamp) === 'Mon' && date('H:i', $this->timestamp) === $this->runAt) call_user_func($callback); | |
} | |
protected function tuesdays(callable $callback) | |
{ | |
if(date('D', $this->timestamp) === 'Tue' && date('H:i', $this->timestamp) === $this->runAt) call_user_func($callback); | |
} | |
protected function wednesdays(callable $callback) | |
{ | |
if(date('D', $this->timestamp) === 'Wed' && date('H:i', $this->timestamp) === $this->runAt) call_user_func($callback); | |
} | |
protected function thursdays(callable $callback) | |
{ | |
if(date('D', $this->timestamp) === 'Thu' && date('H:i', $this->timestamp) === $this->runAt) call_user_func($callback); | |
} | |
protected function fridays(callable $callback) | |
{ | |
if(date('D', $this->timestamp) === 'Fri' && date('H:i', $this->timestamp) === $this->runAt) call_user_func($callback); | |
} | |
protected function saturdays(callable $callback) | |
{ | |
if(date('D', $this->timestamp) === 'Sat' && date('H:i', $this->timestamp) === $this->runAt) call_user_func($callback); | |
} | |
protected function sundays(callable $callback) | |
{ | |
if(date('D', $this->timestamp) === 'Sun' && date('H:i', $this->timestamp) === $this->runAt) call_user_func($callback); | |
} | |
/** | |
* Called once every week (basically the same as using sundays() above...) | |
*/ | |
protected function weekly(callable $callback) | |
{ | |
if(date('D', $this->timestamp) === 'Sun' && date('H:i', $this->timestamp) === $this->runAt) call_user_func($callback); | |
} | |
/** | |
* Called once every week at the specified day and time | |
* | |
* @param string $day [Three letter format (Mon, Tue, ...)] | |
* @param string $time [HH:MM] | |
*/ | |
protected function weeklyOn($day, $time, callable $callback) | |
{ | |
if(date('D', $this->timestamp) === $day && date('H:i', $this->timestamp) === $time) call_user_func($callback); | |
} | |
/** | |
* Called each month on the 1st | |
*/ | |
protected function monthly(callable $callback) | |
{ | |
if(date('d', $this->timestamp) === '01' && date('H:i', $this->timestamp) === $this->runAt) call_user_func($callback); | |
} | |
/** | |
* Called each year on the 1st of January | |
*/ | |
protected function yearly(callable $callback) | |
{ | |
if(date('m', $this->timestamp) === '01' && date('d', $this->timestamp) === '01' && date('H:i', $this->timestamp) === $this->runAt) call_user_func($callback); | |
} | |
} |
thank you very much. you are a life saver.
Thanks MAN!!!!
Hi @sisou,
I got error on log
[2018-03-08 11:50:02] production.ERROR: exception 'InvalidArgumentException' with message 'There are no commands defined in the "cron" namespace.' in /home2/ssuccess/public_html/kriah.org/vendor/symfony/console/Symfony/Component/Console/Application.php:516
Stack trace:
#0 /home2/ssuccess/public_html/kriah.org/vendor/symfony/console/Symfony/Component/Console/Application.php(550): Symfony\Component\Console\Application->findNamespace('cron')
#1 /home2/ssuccess/public_html/kriah.org/vendor/symfony/console/Symfony/Component/Console/Application.php(190): Symfony\Component\Console\Application->find('cron:run')
#2 /home2/ssuccess/public_html/kriah.org/vendor/symfony/console/Symfony/Component/Console/Application.php(124): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#3 /home2/ssuccess/public_html/kriah.org/artisan(58): Symfony\Component\Console\Application->run()
#4 {main} [] []
Nice script.
If I may add. I've changed your code to not rely on
$_SERVER
and usemicrotime(true)
all the way. Also write messages using log's second parameter