-
-
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); | |
| } | |
| } |
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} [] []
thank you very much. you are a life saver.