aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/includes/cron/cron_lock.php
diff options
context:
space:
mode:
authorOleg Pudeyev <oleg@bsdpower.com>2010-04-17 03:13:30 -0400
committerOleg Pudeyev <oleg@bsdpower.com>2011-02-12 22:05:49 -0500
commit0f9b3bcc27e7daf7d605a7a38310a8f62b9a76e8 (patch)
tree15cacd0d8bc8a28bbf1cc73504e7f7f61803a987 /phpBB/includes/cron/cron_lock.php
parent61e0285da86ffaf825cfcd486b5372b9566e51d7 (diff)
downloadforums-0f9b3bcc27e7daf7d605a7a38310a8f62b9a76e8.tar
forums-0f9b3bcc27e7daf7d605a7a38310a8f62b9a76e8.tar.gz
forums-0f9b3bcc27e7daf7d605a7a38310a8f62b9a76e8.tar.bz2
forums-0f9b3bcc27e7daf7d605a7a38310a8f62b9a76e8.tar.xz
forums-0f9b3bcc27e7daf7d605a7a38310a8f62b9a76e8.zip
[feature/system-cron] Refactored cron task naming, loading and running.
PHPBB3-9596
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);
+ }
+}