-
Notifications
You must be signed in to change notification settings - Fork 0
Cron job bootstrapper
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].
[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
$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_time_limit(CRON_TIME_LIMIT);
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();
}
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]
- Original author: Derek Jones
- How to extend helpers: See User Guide
- Modified by: Thomas Stapleton (id, classes, selected country option and all option)
- Modified by: Bradley De-Lar (construct, setLayout example)