44

グローバルに、通知/警告時にPHPの実行を停止させることは可能ですか?

多くのサイトで開発サーバーを実行していますが、無視して先に進むのではなく、開発者にこれらの警告/通知を修正する (または少なくとも助けを求める) ように強制したいと考えています。

4

6 に答える 6

58

はい、可能です。この質問は、PHP でエラーを処理する方法のより一般的な問題について語っています。set_error_handlerドキュメントを使用してカスタム エラー ハンドラを定義および登録し、PHP エラーの処理をカスタマイズする必要があります。

私見では、PHP エラーで例外をスローし、try/catch ブロックを使用してプログラム フローを制御するのが最善ですが、この点では意見が異なります。

OP の指定された目標を達成するには、次のようにします。

function errHandle($errNo, $errStr, $errFile, $errLine) {
    $msg = "$errStr in $errFile on line $errLine";
    if ($errNo == E_NOTICE || $errNo == E_WARNING) {
        throw new ErrorException($msg, $errNo);
    } else {
        echo $msg;
    }
}

set_error_handler('errHandle');

上記のコードは、 orが発生ErrorExceptionするたびに をスローし、スクリプト出力を効果的に終了します (例外がキャッチされない場合)。PHP エラーで例外をスローすることは、並列例外処理戦略 ( ) と組み合わせて、本番環境で正常に終了するのが最適です。E_NOTICEE_WARNINGset_exception_handler

上記の例では、@エラー抑制演算子が考慮されないことに注意してください。これが重要な場合は、次のようにerror_reporting()関数を使用してチェックを追加するだけです。

function errHandle($errNo, $errStr, $errFile, $errLine) {
    if (error_reporting() == 0) {
        // @ suppression used, don't worry about it
        return;
    }
    // handle error here
}
于 2012-05-09T16:49:27.750 に答える
8

これは、 php.ini ファイルDocs内でグローバルに構成できます。

auto_prepend_fileディレクティブDocsを使用して、すべての PHP プロセスによってインクルードされるファイルを指定することで実行できます。

auto_prepend_file "/full/path/to/a/prepend-file.php"

グローバル php.ini ファイル内でこれを行うと、prepend ファイル内のコードが常に実行されるようになります。それを使用して、すべてのエラーを例外に変換するグローバル エラー ハンドラーを登録しますDocs :

<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");

この小さなスクリプトは、すべてのエラー/警告/通知などをErrorException.

set_error_handler()このコード例は短すぎる可能性が高いため (以下でさらにコメントします)、 Docsマニュアル ページの例を見逃さないでください。

error_reportingこれをini ディレクティブDocsと組み合わせます。値は php.ini ファイルに記述されています (または、別のオプションとして、重大度ごとにエラーをset_error_handler処理)。

例外をスローすることは非常に厳密なことです。プログラマーは警告とエラーに対処することを余儀なくされます。そうしないと、コードが機能しなくなります (コード内の@エラー制御演算子を含むものを含めて、無効にします)。

おそらくこれは多すぎて、社内で社会的に受け入れられない. 代わりに、出力バッファリングを利用して、すべてのエラーをログに記録し、出力の最後 (または、より見やすいように上部) に追加することもできます。

エラー例外を作成する (スローしない) と、エラー処理に役立つバックトレースが既にキャプチャされます。

エラーと警告を表示する別の方法は、それらをログ ファイルに記録し、別のプロセスでそのファイルを監視して情報を集約することです。アプリケーションごとに警告の数を表示するスコアボードを作成し、これをオフィスで見えるようにして、チームのパフォーマンスやそのような楽しみを全員が確認できるようにすることができます。

私が言おうとしているのは、技術的な問題の次は社会的な問題であり、創造性を発揮し、実際に開発者と話し合う必要があるということです。警告やエラーを修正することがなぜ重要なのか、それによって彼らのコーディングやスキルがどのように役立つのかを明確にする必要があります。

于 2012-05-10T08:23:59.527 に答える
7

PHP 5.3.0 以降:

set_error_handler(
    function(int $nSeverity, string $strMessage, string $strFilePath, int $nLineNumber){
        if(error_reporting()!==0) // Not error suppression operator @
            throw new \ErrorException($strMessage, /*nExceptionCode*/ 0, $nSeverity, $strFilePath, $nLineNumber);
    },
    /*E_ALL*/ -1
);
于 2012-06-11T01:29:06.367 に答える
5

開発環境にいる場合は、モジュール Xdebug をインストールxdebug.halt_level=E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICEし、PHP ini ファイルのどこかに設定することを検討してください。開発者は をリセットできますが、ハンドラーを元の値に戻すことができるため、 にxdebug.halt_level基づく回答でも同じ問題があります。set_error_handler

于 2016-02-19T19:22:47.557 に答える
-4

サーバーの PHP 構成ファイルでerror_reportingE_ALLに設定できます。

PHP 5 では、新しいエラー レベル E_STRICT が利用可能です。E_STRICT は E_ALL に含まれていないため、この種のエラー レベルを明示的に有効にする必要があります。開発中に E_STRICT を有効にすると、いくつかの利点があります。STRICT メッセージは、推奨されている最新かつ最高のコーディング方法を使用するのに役立ちます。たとえば、非推奨の関数の使用について警告します。

参考:PHP設定マニュアル

次の設定は、スクリプト内のすべてのエラーを出力するためのガイドです。これらは、すべてのスクリプト ファイルの先頭に含める必要があることに注意してください。

<?php

// Turn off all error reporting
error_reporting(0);

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL ^ E_NOTICE);

// Report all PHP errors (see changelog)
error_reporting(E_ALL);

// Report all PHP errors
error_reporting(-1);

// Same as error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);

?>
于 2012-05-09T17:01:24.053 に答える