Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
dmd-club/wp-cron.php
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
115 lines (92 sloc)
2.89 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* WordPress Cron Implementation for hosts, which do not offer CRON or for which | |
* the user has not set up a CRON job pointing to this file. | |
* | |
* The HTTP request to this file will not slow down the visitor who happens to | |
* visit when the cron job is needed to run. | |
* | |
* @package WordPress | |
*/ | |
ignore_user_abort(true); | |
if ( !empty($_POST) || defined('DOING_AJAX') || defined('DOING_CRON') ) | |
die(); | |
/** | |
* Tell WordPress we are doing the CRON task. | |
* | |
* @var bool | |
*/ | |
define('DOING_CRON', true); | |
if ( !defined('ABSPATH') ) { | |
/** Set up WordPress environment */ | |
require_once( dirname( __FILE__ ) . '/wp-load.php' ); | |
} | |
// Uncached doing_cron transient fetch | |
function _get_cron_lock() { | |
global $wpdb; | |
$value = 0; | |
if ( wp_using_ext_object_cache() ) { | |
/* | |
* Skip local cache and force re-fetch of doing_cron transient | |
* in case another process updated the cache. | |
*/ | |
$value = wp_cache_get( 'doing_cron', 'transient', true ); | |
} else { | |
$row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", '_transient_doing_cron' ) ); | |
if ( is_object( $row ) ) | |
$value = $row->option_value; | |
} | |
return $value; | |
} | |
if ( false === $crons = _get_cron_array() ) | |
die(); | |
$keys = array_keys( $crons ); | |
$gmt_time = microtime( true ); | |
if ( isset($keys[0]) && $keys[0] > $gmt_time ) | |
die(); | |
$doing_cron_transient = get_transient( 'doing_cron'); | |
// Use global $doing_wp_cron lock otherwise use the GET lock. If no lock, trying grabbing a new lock. | |
if ( empty( $doing_wp_cron ) ) { | |
if ( empty( $_GET[ 'doing_wp_cron' ] ) ) { | |
// Called from external script/job. Try setting a lock. | |
if ( $doing_cron_transient && ( $doing_cron_transient + WP_CRON_LOCK_TIMEOUT > $gmt_time ) ) | |
return; | |
$doing_cron_transient = $doing_wp_cron = sprintf( '%.22F', microtime( true ) ); | |
set_transient( 'doing_cron', $doing_wp_cron ); | |
} else { | |
$doing_wp_cron = $_GET[ 'doing_wp_cron' ]; | |
} | |
} | |
// Check lock | |
if ( $doing_cron_transient != $doing_wp_cron ) | |
return; | |
foreach ( $crons as $timestamp => $cronhooks ) { | |
if ( $timestamp > $gmt_time ) | |
break; | |
foreach ( $cronhooks as $hook => $keys ) { | |
foreach ( $keys as $k => $v ) { | |
$schedule = $v['schedule']; | |
if ( $schedule != false ) { | |
$new_args = array($timestamp, $schedule, $hook, $v['args']); | |
call_user_func_array('wp_reschedule_event', $new_args); | |
} | |
wp_unschedule_event( $timestamp, $hook, $v['args'] ); | |
/** | |
* Fires scheduled events. | |
* | |
* @internal | |
* @since 2.1.0 | |
* | |
* @param string $hook Name of the hook that was scheduled to be fired. | |
* @param array $args The arguments to be passed to the hook. | |
*/ | |
do_action_ref_array( $hook, $v['args'] ); | |
// If the hook ran too long and another cron process stole the lock, quit. | |
if ( _get_cron_lock() != $doing_wp_cron ) | |
return; | |
} | |
} | |
} | |
if ( _get_cron_lock() == $doing_wp_cron ) | |
delete_transient( 'doing_cron' ); | |
die(); |