Отключить отчет об ошибках полностью в производстве Laravel?

Я хотел бы отключить отчет об ошибках исключительно на производстве, потому что у нас есть очень старый код, который нам еще нужно исправить, но на данный момент он работает (да, мне тоже это не нравится). Мы не можем исправить все за несколько дней, поэтому нам нужно просто подавить предупреждения и исключения, как мы всегда это делали.

Реальная проблема в том, что он уже выбрасывает исключение на простой ленивый баг вроде (потому что var не определен)

if(!$var) { // do whatever } 

пытался

APP_DEBUG = ложь

APP_LOG_LEVEL = аварийный

 display_errors(false); set_error_handler(null); set_exception_handler(null); 

Но он все еще показывает ErrorException

Неопределенная переменная: script_name_vars_def

edit : Код работает так

web.php

 Route::any('/someroute', 'somecontroller@controllerFunc'); 

somecontroller.php

 public controllerFunc() { ob_start(); require '/old_index.php'; $html = ob_get_clean(); return response($html); } 

Таким образом, мы используем маршрутизацию Laravel, не переписывая старый код немедленно.

Я знаю, что я могу исправить это предупреждение очень легко, но есть много и многие из этих ошибок, и нам нужно использовать маршрутизацию Laravel сейчас. Устраните проблемы позже.

идеи

  • Используйте некоторый шаблон в $dontReport .
  • Используйте подавление @ в нужном месте
  • Это может быть http://php.net/manual/en/scream.examples-simple.php

изменить, чтобы объяснить, после каких этапов промежуточное ПО не работает

1) создать midddleware

 php artisan make:middleware SuppressExceptions 

2) Напишите его

SuppressExceptions.php

 public function handle($request, Closure $next) { error_reporting(0); return $next($request); } 

3) Регистрация

Laravel / приложение / Http / Kernel.php

 protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\SuppressExceptions::class, ], 

 error_reporting(0); ini_set('display_errors', 0); 

Вторая строка изменяет значение «display_errors» в файле php.ini

EDIT: добавьте больше кода, чтобы показать, как это должно быть специфичным для среды …

$ env = getenv ('APPLICATION_ENV');

  switch ($env) { case 'production': error_reporting(0); $config = include __DIR__ . '/../app/config/config_prod.php'; break; case 'staging': ini_set('display_errors', 1); $config = include __DIR__ . '/../app/config/config_staging.php'; break; case 'development': case 'local': default: ini_set('display_errors', 1); $config = include __DIR__ . '/../app/config/config_local.php'; break; 

Думаю, ваш php.ini загружен из другого места. Таким образом, настройки все еще не применяются. Попробуйте найти правильное расположение php.ini (вы можете увидеть информацию в phpinfo() ). В любом случае, вы можете переписать эти параметры с помощью вашего в index.php :

 error_reporting(0); ini_set('display_errors', 0); ini_set('display_startup_errors', 0); 

Но, как говорит @Davon в комментарии. Эти настройки будут перезаписаны Laravel. Таким образом, код выше может быть помещен в ваш контроллер. Но это будет грязный хак. Поэтому вам нужно найти другой путь. Попробуйте распечатать .env . Возможно, некоторая настройка неверна.

Да, вы можете изменить отчет об ошибках. Фактически, структура обеспечивает место для перехвата исключений: App\Exceptions\Handler . По умолчанию метод render преобразует исключение, созданное в ответ HTML. Значения APP_ENV и APP_DEBUG будут изменять только то, как будет отображаться этот ответ об ошибке (подробности о трассе стека исключений или нет, в основном).

Попробуйте изменить метод render на

 public function render($request, Exception $exception) { if ($exception instanceof ErrorException) { error_reporting(0); $kernel = app(\Illuminate\Contracts\Http\Kernel::class); $response = $kernel->handle($request)->send(); return $kernel->terminate($request, $response); } return parent::render($request, $exception); } 

Это в основном отключает отчет, а затем пытается повторно обрабатывать запрос. В if вы можете проверить любое условие, которое вы хотите (класс исключения, степень серьезности и т. Д.). Catching ErrorException , вероятно, будет охватывать ваши потребности, но обратите внимание, что вы не сможете восстановить из фатальной ошибки таким образом.

В любом случае, вы должны принять это как «доказательство концепции» … Для не-идемпотентных запросов этот подход «повторной обработки» не является хорошим. Вместо этого просто создайте промежуточное ПО с

 public function handle($request, Closure $next) { error_reporting(0); return $next($request); } 

Как и раньше, фатальные ошибки не могут быть восстановлены таким образом. Но вы можете показать собственное сообщение об ошибке, объединяющее это промежуточное программное обеспечение с использованием метода обработчика исключений:

 public function render($request, Exception $exception) { if ($exception instanceof FatalErrorException) { return view('fatal-error', ['exception' => $exception]); } return parent::render($request, $exception); } 

Laravel подчеркивает бесплатный код ошибки и предупреждения, поэтому лучший способ справиться с этим – просто убедиться, что ваш код не вызывает никаких ошибок, предупреждений или уведомлений.

Если, однако, вы по-прежнему решаете изменить это поведение, вам нужно посмотреть в файле с именем HandleExceptions.php, который обычно находится в файле vendor / laravel / framework / src / illuminate / Foundation / Bootstrap / HandleExceptions.php:

 public function bootstrap(Application $app) { $this->app = $app; error_reporting(-1); // change this line to your desired reporting level set_error_handler([$this, 'handleError']); set_exception_handler([$this, 'handleException']); register_shutdown_function([$this, 'handleShutdown']); if (! $app->environment('testing')) { ini_set('display_errors', 'Off'); } } 

Строка 32, где error_reporting в настоящее время установлена ​​в -1. https://github.com/laravel/framework/blob/5.4/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php

Конечно, изменяя этот код, вам нужно либо предотвратить обновление laravel / framework, либо вам нужно будет проверить этот файл при каждом обновлении.

После обновления этого кода вам потребуется перекомпилировать ваши классы:

 php artisan clear-compiled; php artisan optimize 

Если проблема в том, что вы видите страницу «Кто-то поступил не так», вы можете исправить это с помощью ответа @alepeino wrote:

https://stackoverflow.com/a/44862789/2777970

Но я бы изменил метод рендеринга на:

 public function render($request, Exception $exception) { if (!config('app.debug')) { error_reporting(0); return response('nothing', 500); } return parent::render($request, $exception); } 

Этот метод рендеринга (родительский) является тем, который строит и возвращает html для страницы «Упс», поэтому, если вы перезаписываете его, вы должны быть крутыми.

Чтобы изменить конфигурацию отладки, проверьте, есть ли у вашего config / app.php параметры отладки с использованием значения ENV APP_DEBUG, а на вашем производстве .env проверьте, что для него установлено значение false (APP_DEBUG = false).

Параметры отладки Laravel находятся в файле .env , в котором вы можете установить опцию отладки следующим образом:

 APP_DEBUG = true 

но…

У Laravel также есть механизм конфигурации, который находится в app.php в папке config , по умолчанию:

 'debug' => env('APP_DEBUG', false), 

который говорит Laravel использовать значение .env , а по умолчанию – false , но любой, у кого есть доступ к файлу, может просто изменить его на:

 'debug' => true, 

так что ваше значение .env игнорируется Laravel.