public static function handleFatalError(array $error = null)
 {
     if (null === self::$reservedMemory) {
         return;
     }
     self::$reservedMemory = null;
     $handler = set_error_handler('var_dump', 0);
     $handler = is_array($handler) ? $handler[0] : null;
     restore_error_handler();
     if (!$handler instanceof self) {
         return;
     }
     if (null === $error) {
         $error = error_get_last();
     }
     try {
         while (self::$stackedErrorLevels) {
             static::unstackErrors();
         }
     } catch (\Exception $exception) {
     }
     if ($error && ($error['type'] &= E_PARSE | E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR)) {
         $handler->throwAt(0, true);
         $trace = isset($error['backtrace']) ? $error['backtrace'] : null;
         if (0 === strpos($error['message'], 'Allowed memory') || 0 === strpos($error['message'], 'Out of memory')) {
             $exception = new OutOfMemoryException($handler->levels[$error['type']] . ': ' . $error['message'], 0, $error['type'], $error['file'], $error['line'], 2, false, $trace);
         } else {
             $exception = new FatalErrorException($handler->levels[$error['type']] . ': ' . $error['message'], 0, $error['type'], $error['file'], $error['line'], 2, true, $trace);
         }
     } elseif (!isset($exception)) {
         return;
     }
     try {
         $handler->handleException($exception, $error);
     } catch (FatalErrorException $e) {
     }
 }
Exemple #2
0
 /**
  * Shutdown registered function for handling PHP fatal errors.
  *
  * @param array $error An array as returned by error_get_last()
  *
  * @internal
  */
 public static function handleFatalError(array $error = null)
 {
     self::$reservedMemory = '';
     gc_collect_cycles();
     $handler = set_error_handler('var_dump', 0);
     $handler = is_array($handler) ? $handler[0] : null;
     restore_error_handler();
     if ($handler instanceof self) {
         if (null === $error) {
             $error = error_get_last();
         }
         try {
             while (self::$stackedErrorLevels) {
                 static::unstackErrors();
             }
         } catch (\Exception $exception) {
             // Handled below
         }
         if ($error && $error['type'] & (E_PARSE | E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR)) {
             // Let's not throw anymore but keep logging
             $handler->throwAt(0, true);
             if (0 === strpos($error['message'], 'Allowed memory') || 0 === strpos($error['message'], 'Out of memory')) {
                 $exception = new OutOfMemoryException($handler->levels[$error['type']] . ': ' . $error['message'], 0, $error['type'], $error['file'], $error['line'], 2, false);
             } else {
                 $exception = new FatalErrorException($handler->levels[$error['type']] . ': ' . $error['message'], 0, $error['type'], $error['file'], $error['line'], 2, true);
             }
         } elseif (!isset($exception)) {
             return;
         }
         try {
             $handler->handleException($exception, $error);
         } catch (FatalErrorException $e) {
             // Ignore this re-throw
         }
     }
 }