Skip to content

Cron job bootstrapper

World Wide Web Server edited this page Jul 4, 2012 · 14 revisions

Category:Config | Category:Config::Community | Category:Config::Cron

[h2]Introduction[/h2]

This is a simple bootstrapper file that you can use to directly run your CodeIgniter controllers from the commandline. It's a [b]very easy[/b] and elegant solution for using CI controllers for cron jobs. It also supports [b]logging[/b].

File:cron-1.1.zip

[h2]Troubleshooting[/h2]

[b]"I get this error when I try to execute ./cron.php:"[/b] [code]Invalid interpreter: /usr/bin/php^M[/code]

This is caused by not having UNIX-style line breaks, which usually happens by copying files created on other operating systems. Use this command to convert the line breaks to UNIX format:

[code] mv cron.php cron.old tr -d '\15\32' < cron.old > cron.php rm cron.old [/code]

[code] #!/usr/bin/php <?php

/*
CRON JOB BOOTSTRAPPER
--------------------------------------------------------------

| | This section is used to get a cron job going, using standard | CodeIgniter controllers and functions. | | 1) Set the CRON_CI_INDEX constant to the location of your | CodeIgniter index.php file | 2) Make this file executable (chmod a+x cron.php) | 3) You can then use this file to call any controller function: | ./cron.php --run=/controller/method [--show-output] [--log-file=logfile] [--time-limit=N] | | GOTCHA: Do not load any authentication or session libraries in | controllers you want to run via cron. If you do, they probably | won't run right. | */

define('CRON_CI_INDEX', '/var/www/vhosts/intranet/index.php');   // Your CodeIgniter main index.php file
define('CRON', TRUE);   // Test for this in your controllers if you only want them accessible via cron

Parse the command line

$script = array_shift($argv);
$cmdline = implode(' ', $argv);
$usage = "Usage: cron.php --run=/controller/method [--show-output][-S] [--log-file=logfile] [--time-limit=N]\n\n";
$required = array('--run' => FALSE);
foreach($argv as $arg)
{
    list($param, $value) = explode('=', $arg);
    switch($param)
    {
        case '--run':
            // Simulate an HTTP request
            $_SERVER['PATH_INFO'] = $value;
            $_SERVER['REQUEST_URI'] = $value;
            $required['--run'] = TRUE;
            break;

        case '-S':
        case '--show-output':
            define('CRON_FLUSH_BUFFERS', TRUE);
            break;

        case '--log-file':
            if(is_writable($value)) define('CRON_LOG', $value);
            else die("Logfile $value does not exist or is not writable!\n\n");
            break;

        case '--time-limit':
            define('CRON_TIME_LIMIT', $value);
            break;

        default:
            die($usage);
    }
}

if(!defined('CRON_LOG')) define('CRON_LOG', 'cron.log');
if(!defined('CRON_TIME_LIMIT')) define('CRON_TIME_LIMIT', 0);

foreach($required as $arg => $present)
{
    if(!$present) die($usage);
}

Set run time limit

set_time_limit(CRON_TIME_LIMIT);

Run CI and capture the output

ob_start();

chdir(dirname(CRON_CI_INDEX));
require(CRON_CI_INDEX);           // Main CI index.php file
$output = ob_get_contents();

if(CRON_FLUSH_BUFFERS === TRUE) {
    while(@ob_end_flush());        // display buffer contents
} else {
    ob_end_clean();
}

Log the results of this run

error_log("### ".date('Y-m-d H:i:s')." cron.php $cmdline\n", 3, CRON_LOG);
error_log($output, 3, CRON_LOG);
error_log("\n### \n\n", 3, CRON_LOG);

echo "\n\n";

?> [/code]

Clone this wiki locally