aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/includes/cron/cron_lock.php
diff options
context:
space:
mode:
Diffstat (limited to 'phpBB/includes/cron/cron_lock.php')
-rw-r--r--phpBB/includes/cron/cron_lock.php75
1 files changed, 75 insertions, 0 deletions
diff --git a/phpBB/includes/cron/cron_lock.php b/phpBB/includes/cron/cron_lock.php
new file mode 100644
index 0000000000..1046d62da4
--- /dev/null
+++ b/phpBB/includes/cron/cron_lock.php
@@ -0,0 +1,75 @@
+<?php
+/**
+*
+* @package phpBB3
+* @version $Id$
+* @copyright (c) 2010 phpBB Group
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+/**
+* Cron lock class
+* @package phpBB3
+*/
+class cron_lock
+{
+ private $cron_id;
+
+ function lock()
+ {
+ global $config, $db;
+
+ if (!isset($config['cron_lock']))
+ {
+ set_config('cron_lock', '0', true);
+ }
+
+ // 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())
+ {
+ return false;
+ }
+ }
+
+ $this->cron_id = time() . ' ' . unique_id();
+
+ $sql = 'UPDATE ' . CONFIG_TABLE . "
+ SET config_value = '" . $db->sql_escape($this->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)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ function unlock()
+ {
+ global $db;
+
+ $sql = 'UPDATE ' . CONFIG_TABLE . "
+ SET config_value = '0'
+ WHERE config_name = 'cron_lock' AND config_value = '" . $db->sql_escape($this->cron_id) . "'";
+ $db->sql_query($sql);
+ }
+}