[ Index ]

PHP Cross Reference of WordPress

title

Body

[close]

/ -> wp-cron.php (source)

   1  <?php
   2  /**
   3   * A pseudo-CRON daemon for scheduling WordPress tasks
   4   *
   5   * WP Cron is triggered when the site receives a visit. In the scenario
   6   * where a site may not receive enough visits to execute scheduled tasks
   7   * in a timely manner, this file can be called directly or via a server
   8   * CRON daemon for X number of times.
   9   *
  10   * Defining DISABLE_WP_CRON as true and calling this file directly are
  11   * mutually exclusive and the latter does not rely on the former to work.
  12   *
  13   * The HTTP request to this file will not slow down the visitor who happens to
  14   * visit when the cron job is needed to run.
  15   *
  16   * @package WordPress
  17   */
  18  
  19  ignore_user_abort( true );
  20  
  21  /* Don't make the request block till we finish, if possible. */
  22  if ( function_exists( 'fastcgi_finish_request' ) && version_compare( phpversion(), '7.0.16', '>=' ) ) {
  23      header( 'Expires: Wed, 11 Jan 1984 05:00:00 GMT' );
  24      header( 'Cache-Control: no-cache, must-revalidate, max-age=0' );
  25      fastcgi_finish_request();
  26  }
  27  
  28  if ( ! empty( $_POST ) || defined( 'DOING_AJAX' ) || defined( 'DOING_CRON' ) ) {
  29      die();
  30  }
  31  
  32  /**
  33   * Tell WordPress we are doing the CRON task.
  34   *
  35   * @var bool
  36   */
  37  define( 'DOING_CRON', true );
  38  
  39  if ( ! defined( 'ABSPATH' ) ) {
  40      /** Set up WordPress environment */
  41      require_once( dirname( __FILE__ ) . '/wp-load.php' );
  42  }
  43  
  44  /**
  45   * Retrieves the cron lock.
  46   *
  47   * Returns the uncached `doing_cron` transient.
  48   *
  49   * @ignore
  50   * @since 3.3.0
  51   *
  52   * @global wpdb $wpdb WordPress database abstraction object.
  53   *
  54   * @return string|false Value of the `doing_cron` transient, 0|false otherwise.
  55   */
  56  function _get_cron_lock() {
  57      global $wpdb;
  58  
  59      $value = 0;
  60      if ( wp_using_ext_object_cache() ) {
  61          /*
  62           * Skip local cache and force re-fetch of doing_cron transient
  63           * in case another process updated the cache.
  64           */
  65          $value = wp_cache_get( 'doing_cron', 'transient', true );
  66      } else {
  67          $row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", '_transient_doing_cron' ) );
  68          if ( is_object( $row ) ) {
  69              $value = $row->option_value;
  70          }
  71      }
  72  
  73      return $value;
  74  }
  75  
  76  $crons = wp_get_ready_cron_jobs();
  77  if ( empty( $crons ) ) {
  78      die();
  79  }
  80  
  81  $gmt_time = microtime( true );
  82  
  83  // The cron lock: a unix timestamp from when the cron was spawned.
  84  $doing_cron_transient = get_transient( 'doing_cron' );
  85  
  86  // Use global $doing_wp_cron lock otherwise use the GET lock. If no lock, trying grabbing a new lock.
  87  if ( empty( $doing_wp_cron ) ) {
  88      if ( empty( $_GET['doing_wp_cron'] ) ) {
  89          // Called from external script/job. Try setting a lock.
  90          if ( $doing_cron_transient && ( $doing_cron_transient + WP_CRON_LOCK_TIMEOUT > $gmt_time ) ) {
  91              return;
  92          }
  93          $doing_wp_cron        = sprintf( '%.22F', microtime( true ) );
  94          $doing_cron_transient = $doing_wp_cron;
  95          set_transient( 'doing_cron', $doing_wp_cron );
  96      } else {
  97          $doing_wp_cron = $_GET['doing_wp_cron'];
  98      }
  99  }
 100  
 101  /*
 102   * The cron lock (a unix timestamp set when the cron was spawned),
 103   * must match $doing_wp_cron (the "key").
 104   */
 105  if ( $doing_cron_transient != $doing_wp_cron ) {
 106      return;
 107  }
 108  
 109  foreach ( $crons as $timestamp => $cronhooks ) {
 110      if ( $timestamp > $gmt_time ) {
 111          break;
 112      }
 113  
 114      foreach ( $cronhooks as $hook => $keys ) {
 115  
 116          foreach ( $keys as $k => $v ) {
 117  
 118              $schedule = $v['schedule'];
 119  
 120              if ( $schedule ) {
 121                  $new_args = array( $timestamp, $schedule, $hook, $v['args'] );
 122                  call_user_func_array( 'wp_reschedule_event', $new_args );
 123              }
 124  
 125              wp_unschedule_event( $timestamp, $hook, $v['args'] );
 126  
 127              /**
 128               * Fires scheduled events.
 129               *
 130               * @ignore
 131               * @since 2.1.0
 132               *
 133               * @param string $hook Name of the hook that was scheduled to be fired.
 134               * @param array  $args The arguments to be passed to the hook.
 135               */
 136              do_action_ref_array( $hook, $v['args'] );
 137  
 138              // If the hook ran too long and another cron process stole the lock, quit.
 139              if ( _get_cron_lock() != $doing_wp_cron ) {
 140                  return;
 141              }
 142          }
 143      }
 144  }
 145  
 146  if ( _get_cron_lock() == $doing_wp_cron ) {
 147      delete_transient( 'doing_cron' );
 148  }
 149  
 150  die();


Generated: Mon Aug 19 01:00:03 2019 Cross-referenced by PHPXref 0.7.1