У Yii2 есть собственный обработчик ошибок , который преобразует все нефатальные ошибки php в захватывающие исключения.
Можно ли использовать его только для обработки фатальных ошибок или (лучше) явно указать, какие ошибки следует обрабатывать обработчиком ошибок yii и который должен обрабатываться внутренним обработчиком php?
Т.е. в среде dev я хочу, чтобы все ошибки выдавали исключения и отображали страницу с ошибкой.
Но в среде prod я хочу, чтобы только неустранимые ошибки отображали страницу ошибок с yii, но уведомления и предупреждения должны просто перейти к стандартным журналам php, не бросая exeption.
В настоящее время, если я установил YII_ENABLE_ERROR_HANDLER
в значение true
, я получаю исключение из уведомлений (я не хочу его на prod); если я устанавливаю его на false
, я освобождаю yii фатальные страницы ошибок; и я установил его в true
и установил error_reporting
в 0
, я потерял регистрацию ошибок.
EDIT: Я создал пакет, который реализует поведение, описанное ниже.
Обработчик ошибок Yii2 не может быть сконфигурирован таким образом. Но можно создать собственный обработчик ошибок, расширяя yii\web\ErrorHandler
(или yii\console\ErrorHandler
если требуется).
namespace app\web; use yii\web\ErrorHandler as BaseErrorHandler; class ErrorHandler extends BaseErrorHandler { /** * @var array Used to specify which errors this handler should process. * * Default is ['fatal' => true, 'catchable' => E_ALL | E_STRICT ] * * E_ALL | E_STRICT is a default from set_error_handler() documentation. * * Set * 'catchable' => false * to disable catchable error handling with this ErrorHandler. * * You can also explicitly specify, which error types to process, ie: * 'catchable' => E_ALL & ~E_NOTICE & ~E_STRICT */ public $error_types; /** * @var boolean Used to specify display_errors php ini setting */ public $display_errors = false; /** * @var string Used to reserve memory for fatal error handler. */ private $_memoryReserve; /** * @var \Exception from HHVM error that stores backtrace */ private $_hhvmException; /** * Register this error handler */ public function register() { // by default process all errors // E_ALL | E_STRICT is a default from set_error_handler() documentation $default_error_types = [ 'fatal' => true, 'catchable' => E_ALL | E_STRICT ]; // merge with application configuration $error_types = array_merge($default_error_types, (array) $this->error_types); ini_set('display_errors', $this->display_errors); set_exception_handler([$this, 'handleException']); if (defined('HHVM_VERSION')) { set_error_handler([$this, 'handleHhvmError'], $error_types['catchable']); } else { set_error_handler([$this, 'handleError'], $error_types['catchable']); } if ($this->memoryReserveSize > 0) { $this->_memoryReserve = str_repeat('x', $this->memoryReserveSize); } if ($error_types['fatal']) { register_shutdown_function([$this, 'handleFatalError']); } } }
Затем можно настроить обработчик ошибок:
'components' => [ 'errorHandler' => [ 'class' => 'app\web\ErrorHandler', 'error_types' => [ 'fatal' => true, 'catchable' => YII_DEBUG ? (E_ALL | E_STRICT) : false ], 'display_errors' => ini_get('display_errors') ], ],
В этом примере конфигурации мы говорим, что обработчик ошибок всегда должен обрабатывать фатальные ошибки, но обрабатывать захватывающие ошибки только в том случае, если мы находимся в режиме отладки. В режиме производства все захватывающие ошибки будут обрабатываться внутренним обработчиком ошибок php и появятся в журнале ошибок, если вы его настроите.
Говорят, что display_errors
наследует конфигурацию сервера php от php.ini
или .htaccess
.