Make it possible to not propagate errors to PHP
authorGergő Tisza <tgr.huwiki@gmail.com>
Tue, 21 Feb 2017 00:47:07 +0000 (16:47 -0800)
committerGergő Tisza <tgr.huwiki@gmail.com>
Thu, 8 Feb 2018 22:13:54 +0000 (14:13 -0800)
Add a $wgPropagateErrors configuration variable which can be used
to prevent passing handled errors to PHP (and thus logging them twice).

Bug: T45086
Change-Id: I64ab09762a04de2007b7d7864e3c504a1d6f8aee

includes/DefaultSettings.php
includes/exception/MWExceptionHandler.php

index bdbeb70..a6a3686 100644 (file)
@@ -6275,6 +6275,12 @@ $wgShowDBErrorBacktrace = false;
  */
 $wgLogExceptionBacktrace = true;
 
+/**
+ * If true, the MediaWiki error handler passes errors/warnings to the default error handler
+ * after logging them. The setting is ignored when the track_errors php.ini flag is true.
+ */
+$wgPropagateErrors = true;
+
 /**
  * Expose backend server host names through the API and various HTML comments
  */
index 205ec77..b125f58 100644 (file)
@@ -170,6 +170,8 @@ class MWExceptionHandler {
        public static function handleError(
                $level, $message, $file = null, $line = null
        ) {
+               global $wgPropagateErrors;
+
                if ( in_array( $level, self::$fatalErrorTypes ) ) {
                        return call_user_func_array(
                                'MWExceptionHandler::handleFatalError', func_get_args()
@@ -213,9 +215,10 @@ class MWExceptionHandler {
                $e = new ErrorException( "PHP $levelName: $message", 0, $level, $file, $line );
                self::logError( $e, 'error', $severity );
 
-               // This handler is for logging only. Return false will instruct PHP
-               // to continue regular handling.
-               return false;
+               // If $wgPropagateErrors is true return false so PHP shows/logs the error normally.
+               // Ignore $wgPropagateErrors if the error should break execution, or track_errors is set
+               // (which means someone is counting on regular PHP error handling behavior).
+               return !( $wgPropagateErrors || $level == E_RECOVERABLE_ERROR || ini_get( 'track_errors' ) );
        }
 
        /**