Laravel-4 cron jobs

John picture John · Jan 1, 2014 · Viewed 7.8k times · Source

I need to learn how to work with cron jobs in Laravel..As I can see the documentation does not specify this part.I have found a tutorial but it is about Laravel-3. Can you give me some advice on how to schedule a cron job running once a day..?Is there any tutorial about that issue?

My code so far is the following :

JobDaemon.php :

<?php

use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;

class JobDaemon extends Command {

    /**
     * The console command name.
     *
     * @var string
     */
    protected $name = 'job-daemon';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Get all recent jobs once a day.';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return void
     */
    public function fire()
    {
        $this->info('fired');
    }

    /**
     * Get the console command arguments.
     *
     * @return array
     */
    protected function getArguments()
    {
        return array(
            //array('example', InputArgument::REQUIRED, 'An example argument.'),
        );
    }

    /**
     * Get the console command options.
     *
     * @return array
     */
    protected function getOptions()
    {
        return array(
            //array('example', null, InputOption::VALUE_OPTIONAL, 'An example option.', null),
        );
    }

}

I used the following command to set it up

php artisan command:make JobDaemon

And my artisan file is the following:

<?php

Artisan::add(new JobDaemon);

I get the following from my console...

johnnemo@johnnemo:/opt/lampp/htdocs/e-support-uop$ tail -f /var/log/syslog | grep -i cron
Jan  1 18:31:09 johnnemo crontab[4484]: (johnnemo) REPLACE (johnnemo)
Jan  1 18:31:09 johnnemo crontab[4484]: (johnnemo) END EDIT (johnnemo)
Jan  1 18:35:01 johnnemo CRON[5054]: (johnnemo) CMD (php /opt/lampp/htdocs/e-support-uop/artisan job-daemon)
Jan  1 18:35:02 johnnemo CRON[5053]: (CRON) info (No MTA installed, discarding output)
Jan  1 18:39:01 johnnemo CRON[5064]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -x /usr/lib/php5/sessionclean ] && [ -d /var/lib/php5 ] && /usr/lib/php5/sessionclean /var/lib/php5 $(/usr/lib/php5/maxlifetime))
Jan  1 18:40:01 johnnemo CRON[5076]: (johnnemo) CMD (php /opt/lampp/htdocs/e-support-uop/artisan job-daemon)
Jan  1 18:40:01 johnnemo CRON[5075]: (CRON) info (No MTA installed, discarding output)

Answer

Antonio Carlos Ribeiro picture Antonio Carlos Ribeiro · Jan 1, 2014

First you need to make sure your new command is up, so if you run

php artisan list

'job-daemon' must be in the list of commands

Then you test it:

php artisan job-daemon

Does it work? Cool, now you can set an editor of your own:

export EDITOR=nano

Open the crontab with it:

[sudo] crontab -e

Execute type to the the correct path for your php:

type php

And you should get something like

php is hashed (/opt/lampp/bin/php)

So your php executable is at

/opt/lampp/bin/php

This will open and editor with the current cron jobs, sudo is optional to open the root crontab, just add a line with yours:

25 10 * * * /opt/lampp/bin/php /whatever/directory/your/site/is/artisan job-daemon

This will run your command everyday at 10:25AM.

To execute it every 5 minutes you do

*/5 * * * * /opt/lampp/bin/php /whatever/directory/your/site/is/artisan job-daemon

Then you tail the syslog to see it running:

tail -f /var/log/syslog | grep -i cron

And you should see something like

Jan  1 10:25:01 server CRON[19451]: (root) CMD (php /var/www/<siteName>/artisan job-daemon)

In your command you cann't really print things on the screen, you won't see them printing, so to test you have to, for instance, save something to a file:

public function fire()
{
    File::append('/tmp/laravel.txt', "fired\n");
    Log::info('fired');
}

And then

tail -f /tmp/laravel.txt

To see the results in realtime.