Register
phpBB.com Wiki · Home Projects Help

root / trunk / phpBB / cron.php

1 5476 naderman
<?php
2 8146 acydburn
/**
3 5136 acydburn
*
4 5136 acydburn
* @package phpBB3
5 5136 acydburn
* @version $Id$
6 8146 acydburn
* @copyright (c) 2005 phpBB Group
7 8146 acydburn
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
8 5136 acydburn
*
9 5136 acydburn
*/
10 5136 acydburn
11 5136 acydburn
/**
12 5136 acydburn
*/
13 5136 acydburn
define('IN_PHPBB', true);
14 5136 acydburn
define('IN_CRON', true);
15 8572 acydburn
if (!defined('PHPBB_ROOT_PATH')) define('PHPBB_ROOT_PATH', './');
16 8572 acydburn
if (!defined('PHP_EXT')) define('PHP_EXT', substr(strrchr(__FILE__, '.'), 1));
17 8572 acydburn
include(PHPBB_ROOT_PATH . 'common.' . PHP_EXT);
18 5136 acydburn
19 6048 acydburn
// Do not update users last page entry
20 6048 acydburn
$user->session_begin(false);
21 5957 acydburn
$auth->acl($user->data);
22 5957 acydburn
23 5136 acydburn
$cron_type = request_var('cron_type', '');
24 5136 acydburn
$use_shutdown_function = (@function_exists('register_shutdown_function')) ? true : false;
25 5136 acydburn
26 6317 acydburn
// Output transparent gif
27 6317 acydburn
header('Cache-Control: no-cache');
28 6317 acydburn
header('Content-type: image/gif');
29 6317 acydburn
header('Content-length: 43');
30 6317 acydburn
31 6317 acydburn
echo base64_decode('R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==');
32 6317 acydburn
33 7881 acydburn
// test without flush ;)
34 7881 acydburn
// flush();
35 6317 acydburn
36 8146 acydburn
//
37 8022 acydburn
if (!isset($config['cron_lock']))
38 8022 acydburn
{
39 8022 acydburn
	set_config('cron_lock', '0', true);
40 8022 acydburn
}
41 8022 acydburn
42 7947 naderman
// make sure cron doesn't run multiple times in parallel
43 7947 naderman
if ($config['cron_lock'])
44 7947 naderman
{
45 7947 naderman
	// if the other process is running more than an hour already we have to assume it
46 7947 naderman
	// aborted without cleaning the lock
47 7947 naderman
	$time = explode(' ', $config['cron_lock']);
48 7947 naderman
	$time = $time[0];
49 7947 naderman
50 7947 naderman
	if ($time + 3600 >= time())
51 7947 naderman
	{
52 7947 naderman
		exit;
53 7947 naderman
	}
54 7947 naderman
}
55 7947 naderman
56 7947 naderman
define('CRON_ID', time() . ' ' . unique_id());
57 7947 naderman
58 7947 naderman
$sql = 'UPDATE ' . CONFIG_TABLE . "
59 7947 naderman
	SET config_value = '" . $db->sql_escape(CRON_ID) . "'
60 7947 naderman
	WHERE config_name = 'cron_lock' AND config_value = '" . $db->sql_escape($config['cron_lock']) . "'";
61 7947 naderman
$db->sql_query($sql);
62 7947 naderman
63 7947 naderman
// another cron process altered the table between script start and UPDATE query so exit
64 7947 naderman
if ($db->sql_affectedrows() != 1)
65 7947 naderman
{
66 7947 naderman
	exit;
67 7947 naderman
}
68 7947 naderman
69 5272 acydburn
/**
70 5272 acydburn
* Run cron-like action
71 5272 acydburn
* Real cron-based layer will be introduced in 3.2
72 5272 acydburn
*/
73 5136 acydburn
switch ($cron_type)
74 5136 acydburn
{
75 5136 acydburn
	case 'queue':
76 5929 acydburn
77 8572 acydburn
		if (time() - $config['queue_interval'] <= $config['last_queue_run'] || !file_exists(PHPBB_ROOT_PATH . 'cache/queue.' . PHP_EXT))
78 5929 acydburn
		{
79 5929 acydburn
			break;
80 5929 acydburn
		}
81 5929 acydburn
82 8079 acydburn
		// A user reported using the mail() function while using shutdown does not work. We do not want to risk that.
83 8079 acydburn
		if ($use_shutdown_function && !$config['smtp_delivery'])
84 8079 acydburn
		{
85 8079 acydburn
			$use_shutdown_function = false;
86 8079 acydburn
		}
87 8079 acydburn
88 8572 acydburn
		include_once(PHPBB_ROOT_PATH . 'includes/functions_messenger.' . PHP_EXT);
89 5136 acydburn
		$queue = new queue();
90 5929 acydburn
91 5136 acydburn
		if ($use_shutdown_function)
92 5136 acydburn
		{
93 5136 acydburn
			register_shutdown_function(array(&$queue, 'process'));
94 5136 acydburn
		}
95 5136 acydburn
		else
96 5136 acydburn
		{
97 5136 acydburn
			$queue->process();
98 5136 acydburn
		}
99 5929 acydburn
100 5272 acydburn
	break;
101 5136 acydburn
102 5136 acydburn
	case 'tidy_cache':
103 5929 acydburn
104 5929 acydburn
		if (time() - $config['cache_gc'] <= $config['cache_last_gc'] || !method_exists($cache, 'tidy'))
105 5929 acydburn
		{
106 5929 acydburn
			break;
107 5929 acydburn
		}
108 5929 acydburn
109 5136 acydburn
		if ($use_shutdown_function)
110 5136 acydburn
		{
111 5136 acydburn
			register_shutdown_function(array(&$cache, 'tidy'));
112 5136 acydburn
		}
113 5136 acydburn
		else
114 5136 acydburn
		{
115 5136 acydburn
			$cache->tidy();
116 5136 acydburn
		}
117 5929 acydburn
118 5272 acydburn
	break;
119 5136 acydburn
120 5472 acydburn
	case 'tidy_search':
121 8902 acydburn
122 5476 naderman
		// Select the search method
123 5929 acydburn
		$search_type = basename($config['search_type']);
124 5472 acydburn
125 8572 acydburn
		if (time() - $config['search_gc'] <= $config['search_last_gc'] || !file_exists(PHPBB_ROOT_PATH . 'includes/search/' . $search_type . '.' . PHP_EXT))
126 5476 naderman
		{
127 5476 naderman
			break;
128 5476 naderman
		}
129 5929 acydburn
130 8572 acydburn
		include_once(PHPBB_ROOT_PATH . "includes/search/$search_type." . PHP_EXT);
131 5476 naderman
132 5476 naderman
		// We do some additional checks in the module to ensure it can actually be utilised
133 5476 naderman
		$error = false;
134 5476 naderman
		$search = new $search_type($error);
135 5476 naderman
136 5476 naderman
		if ($error)
137 5476 naderman
		{
138 5476 naderman
			break;
139 5476 naderman
		}
140 5476 naderman
141 5476 naderman
		if ($use_shutdown_function)
142 5476 naderman
		{
143 5476 naderman
			register_shutdown_function(array(&$search, 'tidy'));
144 5476 naderman
		}
145 5476 naderman
		else
146 5476 naderman
		{
147 5476 naderman
			$search->tidy();
148 5476 naderman
		}
149 5476 naderman
150 5929 acydburn
	break;
151 5929 acydburn
152 5602 grahamje
	case 'tidy_warnings':
153 5602 grahamje
154 5929 acydburn
		if (time() - $config['warnings_gc'] <= $config['warnings_last_gc'])
155 5929 acydburn
		{
156 5929 acydburn
			break;
157 5929 acydburn
		}
158 5929 acydburn
159 8572 acydburn
		include_once(PHPBB_ROOT_PATH . 'includes/functions_admin.' . PHP_EXT);
160 5929 acydburn
161 5602 grahamje
		if ($use_shutdown_function)
162 5602 grahamje
		{
163 5602 grahamje
			register_shutdown_function('tidy_warnings');
164 5602 grahamje
		}
165 5602 grahamje
		else
166 5602 grahamje
		{
167 5602 grahamje
			tidy_warnings();
168 5602 grahamje
		}
169 5929 acydburn
170 5602 grahamje
	break;
171 5602 grahamje
172 5136 acydburn
	case 'tidy_database':
173 5136 acydburn
174 5929 acydburn
		if (time() - $config['database_gc'] <= $config['database_last_gc'])
175 5929 acydburn
		{
176 5929 acydburn
			break;
177 5929 acydburn
		}
178 5929 acydburn
179 8572 acydburn
		include_once(PHPBB_ROOT_PATH . 'includes/functions_admin.' . PHP_EXT);
180 5929 acydburn
181 5136 acydburn
		if ($use_shutdown_function)
182 5136 acydburn
		{
183 5136 acydburn
			register_shutdown_function('tidy_database');
184 5136 acydburn
		}
185 5136 acydburn
		else
186 5136 acydburn
		{
187 5136 acydburn
			tidy_database();
188 5136 acydburn
		}
189 5929 acydburn
190 5272 acydburn
	break;
191 5476 naderman
192 5272 acydburn
	case 'tidy_sessions':
193 5929 acydburn
194 5929 acydburn
		if (time() - $config['session_gc'] <= $config['session_last_gc'])
195 5929 acydburn
		{
196 5929 acydburn
			break;
197 5929 acydburn
		}
198 5929 acydburn
199 5171 psotfx
		if ($use_shutdown_function)
200 5171 psotfx
		{
201 5272 acydburn
			register_shutdown_function(array(&$user, 'session_gc'));
202 5171 psotfx
		}
203 5171 psotfx
		else
204 5171 psotfx
		{
205 5272 acydburn
			$user->session_gc();
206 5171 psotfx
		}
207 5929 acydburn
208 5272 acydburn
	break;
209 5272 acydburn
210 5272 acydburn
	case 'prune_forum':
211 5272 acydburn
212 5272 acydburn
		$forum_id = request_var('f', 0);
213 5476 naderman
214 5272 acydburn
		$sql = 'SELECT forum_id, prune_next, enable_prune, prune_days, prune_viewed, forum_flags, prune_freq
215 5272 acydburn
			FROM ' . FORUMS_TABLE . "
216 5272 acydburn
			WHERE forum_id = $forum_id";
217 5272 acydburn
		$result = $db->sql_query($sql);
218 5272 acydburn
		$row = $db->sql_fetchrow($result);
219 5272 acydburn
		$db->sql_freeresult($result);
220 5272 acydburn
221 5272 acydburn
		if (!$row)
222 5272 acydburn
		{
223 5272 acydburn
			break;
224 5272 acydburn
		}
225 5272 acydburn
226 5272 acydburn
		// Do the forum Prune thang
227 5272 acydburn
		if ($row['prune_next'] < time() && $row['enable_prune'])
228 5272 acydburn
		{
229 8572 acydburn
			include_once(PHPBB_ROOT_PATH . 'includes/functions_admin.' . PHP_EXT);
230 5272 acydburn
231 5272 acydburn
			if ($row['prune_days'])
232 5272 acydburn
			{
233 5272 acydburn
				if ($use_shutdown_function)
234 5272 acydburn
				{
235 5272 acydburn
					register_shutdown_function('auto_prune', $row['forum_id'], 'posted', $row['forum_flags'], $row['prune_days'], $row['prune_freq']);
236 5272 acydburn
				}
237 5272 acydburn
				else
238 5272 acydburn
				{
239 5272 acydburn
					auto_prune($row['forum_id'], 'posted', $row['forum_flags'], $row['prune_days'], $row['prune_freq']);
240 5272 acydburn
				}
241 5272 acydburn
			}
242 5272 acydburn
243 5272 acydburn
			if ($row['prune_viewed'])
244 5272 acydburn
			{
245 5272 acydburn
				if ($use_shutdown_function)
246 5272 acydburn
				{
247 5272 acydburn
					register_shutdown_function('auto_prune', $row['forum_id'], 'viewed', $row['forum_flags'], $row['prune_viewed'], $row['prune_freq']);
248 5272 acydburn
				}
249 5272 acydburn
				else
250 5272 acydburn
				{
251 5272 acydburn
					auto_prune($row['forum_id'], 'viewed', $row['forum_flags'], $row['prune_viewed'], $row['prune_freq']);
252 5272 acydburn
				}
253 5272 acydburn
			}
254 5272 acydburn
		}
255 5272 acydburn
256 5272 acydburn
	break;
257 5136 acydburn
}
258 5136 acydburn
259 6055 acydburn
// Unloading cache and closing db after having done the dirty work.
260 6055 acydburn
if ($use_shutdown_function)
261 6054 acydburn
{
262 8087 acydburn
	register_shutdown_function('unlock_cron');
263 6055 acydburn
	register_shutdown_function('garbage_collection');
264 6054 acydburn
}
265 6055 acydburn
else
266 6055 acydburn
{
267 8087 acydburn
	unlock_cron();
268 6055 acydburn
	garbage_collection();
269 6055 acydburn
}
270 6054 acydburn
271 5136 acydburn
exit;
272 5136 acydburn
273 8087 acydburn
274 8087 acydburn
/**
275 8087 acydburn
* Unlock cron script
276 8087 acydburn
*/
277 8087 acydburn
function unlock_cron()
278 8087 acydburn
{
279 8087 acydburn
	global $db;
280 8087 acydburn
281 8087 acydburn
	$sql = 'UPDATE ' . CONFIG_TABLE . "
282 8087 acydburn
		SET config_value = '0'
283 8087 acydburn
		WHERE config_name = 'cron_lock' AND config_value = '" . $db->sql_escape(CRON_ID) . "'";
284 8087 acydburn
	$db->sql_query($sql);
285 8087 acydburn
}
286 8087 acydburn
287 5136 acydburn
?>