web-dev-qa-db-ja.com

Laravel production?

私たちはまだ修正する必要がある非常に古いコードがあるので、本番環境でエラー報告を完全に無効にしたいと思いますが、今のところは機能します(はい、私もそれが好きではありません)。数日ですべてを修正することはできないので、いつものように警告と例外を抑制する必要があります。

実際の問題は、次のような単純な怠bugなバグで既に例外をスローしていることです(varが定義されていないため)

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

試した

APP_DEBUG = false

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', '[email protected]');

somecontroller.php

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

    return response($html);
}

この方法では、古いコードをすぐに書き直すことなくLaravel=ルーティングを使用します。

私はこの警告を非常に簡単に修正できることを知っていますが、これらのエラーは非常に多く、ここでLaravelルーティングを使用する必要があります。後で問題を修正します。

ideas

ミドルウェアが機能しなかったステップを説明するために編集します

1)ミドルウェアを作成する

php artisan make:middleware SuppressExceptions

2)書きます

SuppressExceptions.php

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

3)登録

laravel/app/Http/Kernel.php

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

はい、エラー報告を変更できます。実際、フレームワークは例外をインターセプトする場所を提供します: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をキャッチすることでおそらくニーズをカバーできますが、この方法では致命的なエラーから回復できない可能性があることに注意してください。

とにかく、それを「概念実証」としてとるべきです...べき等でない要求の場合、この「再処理」アプローチは良くありません。代わりに、 ミドルウェアの作成

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

_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
Alex Slipknot

問題が「何かおかしい」というページが表示されている場合は、@ alepeinoが書いた回答で修正できます。

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

ただし、renderメソッドを次のように変更します。

public function render($request, Exception $exception)
{
    if (!config('app.debug')) {
        error_reporting(0);

        return response('nothing', 500);
    }

    return parent::render($request, $exception);
}

このレンダーメソッド(親)は、 "Whoops"ページのhtmlを構築して返すため、上書きする場合はクールである必要があります。

デバッグ構成を変更するには、config/app.phpにENV値APP_DEBUGを使用するデバッグオプションがあるかどうかを確認し、運用環境.envでfalseに設定されていることを確認します(APP_DEBUG = false)。

2
Juan Pablo
error_reporting(0);
ini_set('display_errors', 0);

2行目は、php.iniファイルの 'display_errors'の値を変更します

編集:さらにコードを追加して、これが環境固有である必要があることを示します...

$ 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;
2
Pila

Laravelデバッグ設定は.envファイルにあります。このファイルでは、デバッグオプションを次のように設定できます。

APP_DEBUG = true

しかし...

Laravelにはconfigフォルダーのapp.phpにある設定メカニズムもあります。デフォルトは次のとおりです。

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

これはLaravelに.env値を使用するように指示し、デフォルトはfalseになりますが、ファイルにアクセスできる人は誰でも簡単に変更できます:

'debug' => true,

.env値がLaravelによって無視されるようにします。

2
am05mhz

私のやり方は

app/providers/AppServiceProvider 

ブート機能で

public function boot()
{
   //add error reporting level
   error_reporting(0);
}
1
danny

Laravelはエラーと警告のないコードを強調しているため、これを処理する最良の方法は、コードでエラー、警告、通知が発生しないようにすることです。

更新:Laravelの最近のバージョンでは、以下の方法はお勧めしません。 Laravelは、alepeinoの答えが示すように、ベンダー以外のクラスのApp\Exceptions\Handlerで例外処理を変更できるようになりました。ミドルウェアは、error_reportingを無効にするより良い解決策にもなります。

この以前の回答は歴史的な目的のために維持されていますが、ベンダーファイルの変更はお勧めしません。


ただし、この動作を変更する場合は、vendor/laravel/framework/src/illuminate/Foundation/Bootstrap/HandleExceptions.phpに通常ある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');
    }
}

Error_reportingが現在-1に設定されている行32。 https://github.com/laravel/framework/blob/5.4/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php

もちろん、このコードを変更することにより、laravel/frameworkの更新を防ぐか、更新ごとにこのファイルを確認する必要があります。

このコードを更新した後、クラスを再コンパイルする必要があります。

php artisan clear-compiled; php artisan optimize
1
Devon