diff --git a/src/wp-cron.php b/src/wp-cron.php index 75379a053c..15c6676b77 100644 --- a/src/wp-cron.php +++ b/src/wp-cron.php @@ -64,7 +64,9 @@ $gmt_time = microtime( true ); if ( isset($keys[0]) && $keys[0] > $gmt_time ) die(); -$doing_cron_transient = get_transient( 'doing_cron'); + +// The cron lock: a unix timestamp from when the cron was spawned. +$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 ) ) { @@ -79,7 +81,10 @@ if ( empty( $doing_wp_cron ) ) { } } -// Check lock +/* + * The cron lock (a unix timestamp set when the cron was spawned), + * must match $doing_wp_cron (the "key"). + */ if ( $doing_cron_transient != $doing_wp_cron ) return; diff --git a/src/wp-includes/cron.php b/src/wp-includes/cron.php index 4b755068ab..d9cfcb8dc0 100644 --- a/src/wp-includes/cron.php +++ b/src/wp-includes/cron.php @@ -225,9 +225,12 @@ function spawn_cron( $gmt_time = 0 ) { return; /* - * multiple processes on multiple web servers can run this code concurrently - * try to make this as atomic as possible by setting doing_cron switch - */ + * Get the cron lock, which is a unix timestamp of when the last cron was spawned + * and has not finished running. + * + * Multiple processes on multiple web servers can run this code concurrently, + * this lock attempts to make spawning as atomic as possible. + */ $lock = get_transient('doing_cron'); if ( $lock > $gmt_time + 10 * MINUTE_IN_SECONDS ) @@ -266,6 +269,7 @@ function spawn_cron( $gmt_time = 0 ) { return; } + // Set the cron lock with the current unix timestamp, when the cron is being spawned. $doing_wp_cron = sprintf( '%.22F', $gmt_time ); set_transient( 'doing_cron', $doing_wp_cron );