Make WordPress Core

Changeset 45801


Ignore:
Timestamp:
08/15/2019 12:34:53 AM (7 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.