home | career | drupal | java | mac | mysql | perl | php | scala | uml | unix

Drupal example source code file (poormanscron.module)

This example Drupal source code file (poormanscron.module) is included in the DevDaily.com "Drupal Source Code Warehouse" project. The intent of this project is to help you "Learn Drupal by Example".

PHP - Drupal tags/keywords

10800, array, cron_last, cron_run, cron_threshold, form, function, if, page, php, poormanscron_run_cron_check_access, the, threshold_semaphore, time

The poormanscron.module Drupal example source code

<?php
// $Id: poormanscron.module,v 1.22.2.8 2010/01/17 00:23:12 davereid Exp $

/**
 * @file
 * A module which runs Drupal cron jobs without the cron application.
 */

/**
 * Implements hook_menu().
 */
function poormanscron_menu() {
  $items['poormanscron/run-cron-check'] = array(
    'page callback' => 'poormanscron_run_cron_check',
    'access callback' => 'poormanscron_run_cron_check_access',
    'type' => MENU_CALLBACK,
  );
  return $items;
}

/**
 * Implements hook_init().
 */
function poormanscron_init() {
  if (poormanscron_run_cron_check_access()) {
    drupal_add_js(drupal_get_path('module', 'poormanscron') . '/poormanscron.js');
    $settings = array(
      'basePath' => url('poormanscron'),
      'runNext' => variable_get('cron_last', 0) + variable_get('cron_safe_threshold', 10800),
    );
    drupal_add_js(array('cron' => $settings), 'setting');
  }
}

/**
 * Checks if the feature to automatically run cron is enabled.
 *
 * Also used as a menu access callback for this feature.
 *
 * @return
 *   TRUE if cron threshold is enabled, FALSE otherwise.
 *
 * @see poormanscron_run_cron_check()
 */
function poormanscron_run_cron_check_access() {
  return variable_get('cron_safe_threshold', 10800) > 0;
}

/**
 * Menu callback; executes cron via an image callback.
 *
 * This callback runs cron in a separate HTTP request to prevent "mysterious"
 * slow-downs of regular HTTP requests. It is invoked via an AJAX request
 * (if the client's browser supports JavaScript).
 *
 * @see poormanscron_run_cron_check_access()
 */
function poormanscron_run_cron_check() {
  $time = time();
  $cron_run = FALSE;
  $cron_threshold = variable_get('cron_safe_threshold', 10800);

  // Cron threshold semaphore is used to avoid errors every time the image
  // callback is displayed when a previous cron is still running.
  $threshold_semaphore = variable_get('cron_threshold_semaphore', FALSE);
  if ($threshold_semaphore) {
    if ($time - $threshold_semaphore > 3600) {
      // Either cron has been running for more than an hour or the semaphore
      // was not reset due to a database error.
      watchdog('cron', 'Cron has been running for more than an hour and is most likely stuck.', array(), WATCHDOG_ERROR);

      // Release the cron threshold semaphore.
      variable_del('cron_threshold_semaphore');
    }
  }
  else {
    // Run cron automatically if it has never run or threshold was crossed.
    $cron_last = variable_get('cron_last', 0);
    if ($time - $cron_last > $cron_threshold) {
      // Lock cron threshold semaphore.
      variable_set('cron_threshold_semaphore', $time);
      $cron_run = drupal_cron_run();
      // Release the cron threshold semaphore.
      variable_del('cron_threshold_semaphore');

      if ($cron_run) {
        // Truncate the page cache so that cached pages get a new timestamp for
        // the next cron run.
        cache_clear_all('*', 'cache_page', TRUE);
      }
    }
  }

  $cron_last = variable_get('cron_last', 0);
  drupal_set_header('Expires: ' . gmdate('D, d M Y H:i:s O', $cron_last + $cron_threshold));

  drupal_json(array('cron_run' => $cron_run));
  // @todo Should we allow this to be cached?
  exit;
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function poormanscron_form_system_site_information_settings_alter(&$form, &$form_state) {
  $form['cron_safe_threshold'] = array(
    '#type' => 'select',
    '#title' => t('Automatically run cron'),
    '#default_value' => variable_get('cron_safe_threshold', 10800),
    '#options' => array(0 => t('Never')) + drupal_map_assoc(array(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 <a href="@status-report-url">status report page</a>.', array('@status-report-url' => url('admin/reports/status'))),
  );
  $form['buttons'] += array('#weight' => 100);
  array_unshift($form['#submit'], 'poormanscron_site_information_settings_submit');
}

/**
 * Form submit callback; clears the page cache if cron settings were changed.
 */
function poormanscron_site_information_settings_submit($form, $form_state) {
  if (variable_get('cron_safe_threshold', 10800) != $form_state['values']['cron_safe_threshold']) {
    cache_clear_all('*', 'cache_page', TRUE);
  }
}

Other Drupal examples (source code examples)

Here is a short list of links related to this Drupal poormanscron.module source code file:

new blog posts

"Drupal" is a registered trademark of Dries Buytaert.

my drupal tutorials and examples  

Copyright 1998-2016 Alvin Alexander, alvinalexander.com
All Rights Reserved.

Beginning in 2016, a portion of the proceeds from pages under the '/drupal-code-examples/' URI will be donated to charity.