Skip to content

Instantly share code, notes, and snippets.

@sisou
Last active June 18, 2022 10:29
Show Gist options
  • Save sisou/889971461616661d2ed6 to your computer and use it in GitHub Desktop.
Save sisou/889971461616661d2ed6 to your computer and use it in GitHub Desktop.
Cron job command for Laravel 4.2
<?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);
}
}
@alwinkpc
Copy link

Nice script.

If I may add. I've changed your code to not rely on $_SERVER and use microtime(true) all the way. Also write messages using log's second parameter

    public function fire()
    {
        $start = microtime(true);
        ...
        $this->finish($start);
    }

    protected function finish($start)
    {
        $executionTime = (microtime(true) - $start);
        Log::info(sprintf('Cron task executed in %1.4Fµs', $executionTime), $this->messages);
    }

@wargodz009
Copy link

thank you very much. you are a life saver.

@wendellpalazzo
Copy link

Thanks MAN!!!!

@Ashushi
Copy link

Ashushi commented Mar 8, 2018

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} [] []

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment