Index: system.admin.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.admin.inc,v retrieving revision 1.158 diff -u -r1.158 system.admin.inc --- modules/system/system.admin.inc 19 Jun 2009 20:35:05 -0000 1.158 +++ modules/system/system.admin.inc 29 Jun 2009 10:34:43 -0000 @@ -1241,6 +1241,14 @@ '#description' => t('Render all blocks on the default 404 (not found) page. Disabling blocks can help with performance but might leave users with a less functional site.'), '#default_value' => variable_get('site_404_blocks', 0) ); + $form['cron_safe_threshold'] = array( + '#type' => 'select', + '#title' => t('Automatically run cron'), + '#default_value' => variable_get('cron_safe_threshold', DRUPAL_DEFAULT_CRON_THRESHOLD), + '#options' => array(0 => t('Never')) + drupal_map_assoc(array(1,3600, 10800, 21600, 43200, 86400, 604800), 'format_interval'), + '#description' => t('When enabled, the site will check whether cron has been run in the configured interval and automatically run it upon the next page request. For more information visit the status report page.', array('@status-report-url' => url('admin/reports/status'))), + ); + $form['#validate'][] = 'system_site_information_settings_validate'; return system_settings_form($form); Index: system.module =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.module,v retrieving revision 1.716 diff -u -r1.716 system.module --- modules/system/system.module 28 Jun 2009 12:52:57 -0000 1.716 +++ modules/system/system.module 29 Jun 2009 10:48:21 -0000 @@ -42,6 +42,11 @@ define('DRUPAL_MAXIMUM_TEMP_FILE_AGE', 21600); /** + * Default interval between automatically ran cron task in seconds. + */ +define('DRUPAL_DEFAULT_CRON_THRESHOLD', 10800); + +/** * New users will be set to the default time zone at registration. */ define('DRUPAL_USER_TIMEZONE_DEFAULT', 0); @@ -476,6 +481,13 @@ 'access callback' => TRUE, 'type' => MENU_CALLBACK, ); + $items['system/cron/%'] = array( + 'title' => 'Execute cron', + 'page callback' => 'system_run_cron_image', + 'page arguments' => array(2), + 'access callback' => '_system_run_cron_image_access', + 'type' => MENU_CALLBACK, + ); $items['admin'] = array( 'title' => 'Administer', 'access arguments' => array('access administration pages'), @@ -2569,3 +2581,42 @@ } return $local; } + +/** + * Implement hook_footer(). + * + * Add a transparent 1x1 image in the closure of the page when the cron needs + * to run. + */ +function system_footer() { + $cron_last = variable_get('cron_last', NULL); + // The image that will make cron run is displayed only if the feature is + // enabled and if the threshold was reached. + if (($cron_threshold = variable_get('cron_safe_threshold', DRUPAL_DEFAULT_CRON_THRESHOLD)) > 0 && + (!isset($cron_last) || (REQUEST_TIME - $cron_last > $cron_threshold))) { + return ''; + } +} + +/** + * Menu page callback; execute the cron via an image callback. + */ +function system_run_cron_image($token) { + // Output a transparent 1x1 image to the browser. + drupal_set_header('Content-Type: image/gif'); + echo "\x47\x49\x46\x38\x39\x61\x1\x0\x1\x0\x80\xff\x0\xc0\xc0\xc0\x0\x0\x0\x21\xf9\x4\x1\x0\x0\x0\x0\x2c\x0\x0\x0\x0\x1\x0\x1\x0\x0\x2\x2\x44\x1\x0\x3b"; + + $cron_last = variable_get('cron_last', NULL); + // Execute the cron if the token is valid or if user is anonymous + if (drupal_valid_token($token, $cron_last, TRUE)) { + drupal_cron_run(); + } + exit; +} + +/** + * Menu access callback; allow only if the feature is enabled manually or by default + */ +function _system_run_cron_image_access() { + return variable_get('cron_safe_threshold', DRUPAL_DEFAULT_CRON_THRESHOLD) > 0; +} \ No newline at end of file