Make WordPress Core

Changeset 44674


Ignore:
Timestamp:
01/21/2019 08:14:56 PM (6 years ago)
Author:
flixos90
Message:

Bootstrap/Load: Change shutdown handler naming to final fatal error handler and allow disabling the handler entirely via a constant.

The WP_Shutdown_Handler name plus related function names were premature when originally committed, as there can be multiple shutdown handlers in PHP, and WordPress makes use of that feature. This changeset modifies the name to a more appropriate WP_Fatal_Error_Handler, and related to that changes the following names:

  • The drop-in to override the handler is now called fatal-error-handler.php.
  • The internal function wp_register_premature_shutdown_handler is now called wp_register_fatal_error_handler().

In addition to these naming changes, a new constant WP_DISABLE_FATAL_ERROR_HANDLER is introduced that can be set in wp-config.php to entirely disable the fatal error handler. That constant's value is and should be accessed indirectly via a new wp_is_fatal_error_handler_enabled() function and is filterable via a new wp_fatal_error_handler_enabled hook. Note that disabling the fatal error handler will skip the new functionality entirely, including the potentially used fatal-error-handler.php drop-in.

The new set of constant, filter and function provide for an easier-to-use mechanism to disable the fatal error handler altogether, rather than requiring developers to implement a drop-in for purely that purpose.

Props afragen, flixos90, joyously, knutsp, markjaquith, ocean90, schlessera, spacedmonkey.
Fixes #46047. See #44458.

Location:
trunk/src
Files:
3 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/plugin.php

    r44630 r44674  
    469469function _get_dropins() {
    470470    $dropins = array(
    471         'advanced-cache.php'   => array( __( 'Advanced caching plugin.' ), 'WP_CACHE' ), // WP_CACHE
    472         'db.php'               => array( __( 'Custom database class.' ), true ), // auto on load
    473         'db-error.php'         => array( __( 'Custom database error message.' ), true ), // auto on error
    474         'install.php'          => array( __( 'Custom installation script.' ), true ), // auto on installation
    475         'maintenance.php'      => array( __( 'Custom maintenance message.' ), true ), // auto on maintenance
    476         'object-cache.php'     => array( __( 'External object cache.' ), true ), // auto on load
    477         'php-error.php'        => array( __( 'Custom PHP error message.' ), true ), // auto on error
    478         'shutdown-handler.php' => array( __( 'Custom PHP shutdown handler.' ), true ), // auto on error
     471        'advanced-cache.php'      => array( __( 'Advanced caching plugin.' ), 'WP_CACHE' ), // WP_CACHE
     472        'db.php'                  => array( __( 'Custom database class.' ), true ), // auto on load
     473        'db-error.php'            => array( __( 'Custom database error message.' ), true ), // auto on error
     474        'install.php'             => array( __( 'Custom installation script.' ), true ), // auto on installation
     475        'maintenance.php'         => array( __( 'Custom maintenance message.' ), true ), // auto on maintenance
     476        'object-cache.php'        => array( __( 'External object cache.' ), true ), // auto on load
     477        'php-error.php'           => array( __( 'Custom PHP error message.' ), true ), // auto on error
     478        'fatal-error-handler.php' => array( __( 'Custom PHP fatal error handler.' ), true ), // auto on error
    479479    );
    480480
  • trunk/src/wp-includes/class-wp-fatal-error-handler.php

    r44673 r44674  
    11<?php
    22/**
    3  * Error Protection API: WP_Shutdown_Handler class
     3 * Error Protection API: WP_Fatal_Error_Handler class
    44 *
    55 * @package WordPress
     
    88
    99/**
    10  * Core class used as the default shutdown handler.
     10 * Core class used as the default shutdown handler for fatal errors.
    1111 *
    12  * A drop-in 'shutdown-handler.php' can be used to override the instance of this class and use a custom implementation
    13  * for the shutdown handler that WordPress registers. The custom class should extend this class and can override its
    14  * methods individually as necessary. The file must return the instance of the class that should be registered.
     12 * A drop-in 'fatal-error-handler.php' can be used to override the instance of this class and use a custom
     13 * implementation for the fatal error handler that WordPress registers. The custom class should extend this class and
     14 * can override its methods individually as necessary. The file must return the instance of the class that should be
     15 * registered.
    1516 *
    1617 * @since 5.1.0
    1718 */
    18 class WP_Shutdown_Handler {
     19class WP_Fatal_Error_Handler {
    1920
    2021    /**
     
    127128     * `wp-includes/load.php` should be checked for before being called.
    128129     *
    129      * If no such drop-in is available, this will call {@see WP_Shutdown_Handler::display_default_error_template()}.
     130     * If no such drop-in is available, this will call {@see WP_Fatal_Error_Handler::display_default_error_template()}.
    130131     *
    131132     * @since 5.1.0
  • trunk/src/wp-includes/error-protection.php

    r44524 r44674  
    149149
    150150/**
    151  * Registers the WordPress premature shutdown handler.
     151 * Registers the shutdown handler for fatal errors.
     152 *
     153 * The handler will only be registered if {@see wp_is_fatal_error_handler_enabled()} returns true.
    152154 *
    153155 * @since 5.1.0
    154156 */
    155 function wp_register_premature_shutdown_handler() {
     157function wp_register_fatal_error_handler() {
     158    if ( ! wp_is_fatal_error_handler_enabled() ) {
     159        return;
     160    }
     161
    156162    $handler = null;
    157     if ( defined( 'WP_CONTENT_DIR' ) && is_readable( WP_CONTENT_DIR . '/shutdown-handler.php' ) ) {
    158         $handler = include WP_CONTENT_DIR . '/shutdown-handler.php';
     163    if ( defined( 'WP_CONTENT_DIR' ) && is_readable( WP_CONTENT_DIR . '/fatal-error-handler.php' ) ) {
     164        $handler = include WP_CONTENT_DIR . '/fatal-error-handler.php';
    159165    }
    160166
    161167    if ( ! is_object( $handler ) || ! is_callable( array( $handler, 'handle' ) ) ) {
    162         $handler = new WP_Shutdown_Handler();
     168        $handler = new WP_Fatal_Error_Handler();
    163169    }
    164170
    165171    register_shutdown_function( array( $handler, 'handle' ) );
    166172}
     173
     174/**
     175 * Checks whether the fatal error handler is enabled.
     176 *
     177 * A constant `WP_DISABLE_FATAL_ERROR_HANDLER` can be set in `wp-config.php` to disable it, or alternatively the
     178 * {@see 'wp_fatal_error_handler_enabled'} filter can be used to modify the return value.
     179 *
     180 * @since 5.1.0
     181 *
     182 * @return bool True if the fatal error handler is enabled, false otherwise.
     183 */
     184function wp_is_fatal_error_handler_enabled() {
     185    $enabled = ! defined( 'WP_DISABLE_FATAL_ERROR_HANDLER' ) || ! WP_DISABLE_FATAL_ERROR_HANDLER;
     186
     187    /**
     188     * Filters whether the fatal error handler is enabled.
     189     *
     190     * @since 5.1.0
     191     *
     192     * @param bool $enabled True if the fatal error handler is enabled, false otherwise.
     193     */
     194    return apply_filters( 'wp_fatal_error_handler_enabled', $enabled );
     195}
  • trunk/src/wp-settings.php

    r44524 r44674  
    1919require( ABSPATH . WPINC . '/load.php' );
    2020require( ABSPATH . WPINC . '/class-wp-paused-extensions-storage.php' );
    21 require( ABSPATH . WPINC . '/class-wp-shutdown-handler.php' );
     21require( ABSPATH . WPINC . '/class-wp-fatal-error-handler.php' );
    2222require( ABSPATH . WPINC . '/error-protection.php' );
    2323require( ABSPATH . WPINC . '/default-constants.php' );
    2424require_once( ABSPATH . WPINC . '/plugin.php' );
    2525
    26 // Make sure we register the premature shutdown handler as soon as possible.
    27 wp_register_premature_shutdown_handler();
     26// Make sure we register the shutdown handler for fatal errors as soon as possible.
     27wp_register_fatal_error_handler();
    2828
    2929/*
Note: See TracChangeset for help on using the changeset viewer.