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]

[b]cron.php bombs around line 82:[/b] [code]require(CRON_CI_INDEX); // Main CI index.php file[/cron] This would only happen if you don't have the path to your application's main [b]index.php[/b] defined correctly at line 24: [code]define('CRON_CI_INDEX', '/var/www/vhosts/intranet/index.php'); // Your CodeIgniter main index.php file[/code]

[b]"I don't get any errors or output and the script doesn't seem to run. What would cause this?"[/b] Apparently some authentication libraries, such as Michael Wales' Erkana authentication library, cause this sort of behaviour (it's possible that any code that depends on sessions could cause this). Just use some conditional logic testing to see if the CRON constant is defined before auto-loading any authentication libraries.

[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