Make WordPress Core

Changeset 45801


Ignore:
Timestamp:
08/15/2019 12:34:53 AM (6 years ago)
Author:
peterwilsoncc
Message:

Site Health Check: Increase time allowance for cron checks.

Introduces WP_Site_Health::has_late_cron() for late wp-cron jobs and extends the time allowance before a job is considered missed.

In a standard configuration using loopback requests, a job is considered late once past due and missed over five minutes past due.

Late and missed time frames are extended if DISABLE_WP_CRON is defined as true to allow for crontab tasks running less frequently. A job is considered late once it's 15 minutes past due and missed over one hour past due.

A file for site health unit tests has been introduced with tests for cron in critical, late and missed states.

Props rockfire, afragen, peterwilsoncc.
Fixes #47223.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/class-wp-site-health.php

    r45733 r45801  
    1212    private $mysql_rec_version_check;
    1313
    14     public  $is_mariadb                          = false;
     14    public $is_mariadb                           = false;
    1515    private $mysql_server_version                = '';
    1616    private $health_check_mysql_required_version = '5.5';
     
    1919    public $schedules;
    2020    public $crons;
    21     public $last_missed_cron = null;
     21    public $last_missed_cron     = null;
     22    public $last_late_cron       = null;
     23    private $timeout_missed_cron = null;
     24    private $timeout_late_cron   = null;
    2225
    2326    /**
     
    2831    public function __construct() {
    2932        $this->prepare_sql_data();
     33
     34        $this->timeout_late_cron   = 0;
     35        $this->timeout_missed_cron = - 5 * MINUTE_IN_SECONDS;
     36
     37        if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) {
     38            $this->timeout_late_cron   = - 15 * MINUTE_IN_SECONDS;
     39            $this->timeout_missed_cron = - 1 * HOUR_IN_SECONDS;
     40        }
    3041
    3142        add_filter( 'admin_body_class', array( $this, 'admin_body_class' ) );
     
    14171428                )
    14181429            );
    1419         } else {
    1420             if ( $this->has_missed_cron() ) {
    1421                 $result['status'] = 'recommended';
    1422 
    1423                 $result['label'] = __( 'A scheduled event has failed' );
    1424 
    1425                 $result['description'] = sprintf(
    1426                     '<p>%s</p>',
    1427                     sprintf(
    1428                         /* translators: %s: The name of the failed cron event. */
    1429                         __( 'The scheduled event, %s, failed to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended.' ),
    1430                         $this->last_missed_cron
    1431                     )
    1432                 );
    1433             }
     1430        } elseif ( $this->has_missed_cron() ) {
     1431            $result['status'] = 'recommended';
     1432
     1433            $result['label'] = __( 'A scheduled event has failed' );
     1434
     1435            $result['description'] = sprintf(
     1436                '<p>%s</p>',
     1437                sprintf(
     1438                    /* translators: %s: The name of the failed cron event. */
     1439                    __( 'The scheduled event, %s, failed to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended.' ),
     1440                    $this->last_missed_cron
     1441                )
     1442            );
     1443        } elseif ( $this->has_late_cron() ) {
     1444            $result['status'] = 'recommended';
     1445
     1446            $result['label'] = __( 'A scheduled event is late' );
     1447
     1448            $result['description'] = sprintf(
     1449                '<p>%s</p>',
     1450                sprintf(
     1451                    /* translators: %s: The name of the late cron event. */
     1452                    __( 'The scheduled event, %s, is late to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended.' ),
     1453                    $this->last_late_cron
     1454                )
     1455            );
    14341456        }
    14351457
     
    19271949
    19281950        foreach ( $this->crons as $id => $cron ) {
    1929             if ( ( $cron->time - time() ) < 0 ) {
     1951            if ( ( $cron->time - time() ) < $this->timeout_missed_cron ) {
    19301952                $this->last_missed_cron = $cron->hook;
     1953                return true;
     1954            }
     1955        }
     1956
     1957        return false;
     1958    }
     1959
     1960    /**
     1961     * Check if any scheduled tasks are late.
     1962     *
     1963     * Returns a boolean value of `true` if a scheduled task is late and ends processing. If the list of
     1964     * crons is an instance of WP_Error, return the instance instead of a boolean value.
     1965     *
     1966     * @return bool|WP_Error true if a cron is late, false if it wasn't. WP_Error if the cron is set to that.
     1967     */
     1968    public function has_late_cron() {
     1969        if ( is_wp_error( $this->crons ) ) {
     1970            return $this->crons;
     1971        }
     1972
     1973        foreach ( $this->crons as $id => $cron ) {
     1974            $cron_offset = $cron->time - time();
     1975            if (
     1976                    $cron_offset >= $this->timeout_missed_cron &&
     1977                    $cron_offset < $this->timeout_late_cron
     1978                ) {
     1979                $this->last_late_cron = $cron->hook;
    19311980                return true;
    19321981            }
Note: See TracChangeset for help on using the changeset viewer.