私たちはまだ修正する必要がある非常に古いコードがあるので、本番環境でエラー報告を完全に無効にしたいと思いますが、今のところは機能します(はい、私もそれが好きではありません)。数日ですべてを修正することはできないので、いつものように警告と例外を抑制する必要があります。
実際の問題は、次のような単純な怠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', 'somecontroller@controllerFunc');
somecontroller.php
public controllerFunc() {
ob_start();
require '/old_index.php';
$html = ob_get_clean();
return response($html);
}
この方法では、古いコードをすぐに書き直すことなくLaravel=ルーティングを使用します。
私はこの警告を非常に簡単に修正できることを知っていますが、これらのエラーは非常に多く、ここでLaravelルーティングを使用する必要があります。後で問題を修正します。
ideas
$dontReport
でワイルドカードを使用します。@
抑制を使用するミドルウェアが機能しなかったステップを説明するために編集します
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,
],
はい、エラー報告を変更できます。実際、フレームワークは例外をインターセプトする場所を提供します: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);
}
_php.ini
_は別の場所からロードされたと思います。したがって、設定はまだ適用されません。 _php.ini
_の正しい場所を見つけてください(phpinfo()
で情報を確認できます)。とにかく、これらのパラメーターを_index.php
_のパラメーターで書き換えることができます。
_error_reporting(0);
ini_set('display_errors', 0);
ini_set('display_startup_errors', 0);
_
しかし、@ Davonがコメントで述べているように。これらの設定はLaravelによって上書きされます。したがって、上記のコードをコントローラーに配置できます。しかし、それは汚いハックになります。だから、あなたは別の方法を見つけなければなりません。 _.env
_のコンテンツを印刷してみてください。たぶんいくつかの設定が間違っています。
問題が「何かおかしい」というページが表示されている場合は、@ 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)。
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;
Laravelデバッグ設定は.env
ファイルにあります。このファイルでは、デバッグオプションを次のように設定できます。
APP_DEBUG = true
しかし...
Laravelにはconfig
フォルダーのapp.php
にある設定メカニズムもあります。デフォルトは次のとおりです。
'debug' => env('APP_DEBUG', false),
これはLaravelに.env
値を使用するように指示し、デフォルトはfalse
になりますが、ファイルにアクセスできる人は誰でも簡単に変更できます:
'debug' => true,
.env
値がLaravelによって無視されるようにします。
私のやり方は
app/providers/AppServiceProvider
ブート機能で
public function boot()
{
//add error reporting level
error_reporting(0);
}
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