Отключить отчет об ошибках полностью в производстве 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

редактировать: код работает так

web.php

Route::any('/someroute', '[email protected]');

somecontroller.php

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

    return response($html);
}

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

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

идеи

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

1) создать промежуточное ПО

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,
],

Ответ 1

Да, вы можете изменить сообщение об ошибке. Фактически, платформа предоставляет место для перехвата исключений: 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 вы можете проверить наличие любого условия (класс исключения, серьезность и т.д.). ErrorException, вероятно, покроет ваши потребности, но обратите внимание, что вы, возможно, не сможете восстановиться после фатальной ошибки таким образом.

В любом случае, вы должны принять это как "доказательство концепции"... Для неидемпотентных запросов такой подход "повторной обработки" не годится. Вместо этого просто создайте Middleware с

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);
}

Ответ 2

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

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

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

Ответ 3

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;

Ответ 4

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

APP_DEBUG = true

но...

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

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

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

'debug' => true,

чтобы ваше значение .env игнорировалось Laravel.

Ответ 5

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

Обновление: я не рекомендую ниже метод для последних версий Laravel. Laravel теперь позволяет вам изменять обработку исключений в классе, не принадлежащем поставщику: App\Exceptions\Handler, как указано в ответе alepeino. Промежуточное программное обеспечение также может быть лучшим решением для отключения error_reporting.

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


Однако, если вы все же решите изменить это поведение, вам нужно поискать файл с именем HandleExceptions.php, который обычно находится по адресу vendor/laravel/framework/src/lightingate/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

Ответ 6

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

fooobar.com/questions/846884/...

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

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).

Ответ 7

как я в

appServiceProvider 

public function boot()
{
   error_reporting(0);
}