diff options
Diffstat (limited to 'phpBB/cron.php')
| -rw-r--r-- | phpBB/cron.php | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/phpBB/cron.php b/phpBB/cron.php index ea4c4ddef2..6c7b4311aa 100644 --- a/phpBB/cron.php +++ b/phpBB/cron.php @@ -33,6 +33,33 @@ echo base64_decode('R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw== // test without flush ;) // flush(); +// make sure cron doesn't run multiple times in parallel +if ($config['cron_lock']) +{ + // if the other process is running more than an hour already we have to assume it + // aborted without cleaning the lock + $time = explode(' ', $config['cron_lock']); + $time = $time[0]; + + if ($time + 3600 >= time()) + { + exit; + } +} + +define('CRON_ID', time() . ' ' . unique_id()); + +$sql = 'UPDATE ' . CONFIG_TABLE . " + SET config_value = '" . $db->sql_escape(CRON_ID) . "' + WHERE config_name = 'cron_lock' AND config_value = '" . $db->sql_escape($config['cron_lock']) . "'"; +$db->sql_query($sql); + +// another cron process altered the table between script start and UPDATE query so exit +if ($db->sql_affectedrows() != 1) +{ + exit; +} + /** * Run cron-like action * Real cron-based layer will be introduced in 3.2 @@ -227,6 +254,11 @@ else garbage_collection(); } +$sql = 'UPDATE ' . CONFIG_TABLE . " + SET config_value = '0' + WHERE config_name = 'cron_lock' AND config_value = '" . $db->sql_escape(CRON_ID) . "'"; +$db->sql_query($sql); + exit; ?>
\ No newline at end of file |
