ホームページ  >  記事  >  バックエンド開発  >  PHPのset_error_handler()関数の使い方を詳しく解説(例)_PHPチュートリアル

PHPのset_error_handler()関数の使い方を詳しく解説(例)_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:25:17967ブラウズ

プログラムを作成すると、必ず問題が発生します (問題に遭遇することはよくあります)。PHP でエラーが発生すると、エラー スクリプトの場所、行番号、および理由が表示されます。大したことではないと言う人も多い。実際、デバッグ段階では、これは実際には問題ではなく、エラー パスを示すことが必要だと思います。
しかし、一部の侵入者にとって、実際のパスが漏洩した場合の影響は想像を絶するものであり、実際、多くのサーバーがこの問題を抱えています。ネットワーク管理者の中には、PHP 設定ファイルの display_errors を Off に設定するだけで問題を解決する人もいます (私たちがそうしたようです) が、この方法はあまりにも消極的すぎると思います。
デバッグのためにエラー情報を返すために PHP が本当に必要になる場合があります。また、何か問題が発生した場合は、ユーザーに説明したり、別のページに移動したりする必要がある場合もあります。それで、解決策は何でしょうか?
set_error_handler()
PHP は 4.1.0 以降、カスタム エラー処理ハンドル用の関数 set_error_handler() を提供していますが、それを知っているスクリプト作成者はほとんどいません。 set_error_handler 関数はエラーパスの漏洩を防ぐことができますが、もちろん他の関数もあります。
エラーをマスクするために使用できます。 エラーが発生すると、一部の情報がユーザーに公開され、ハッカーが Web サイトを攻撃するツールとなる可能性が非常に高くなります。 次に、ユーザーにあなたのレベルが非常に低いと感じさせます。
エラー情報を書き留めて、本番環境の問題を時間内に発見できます。
エラーが発生した場合、対応する処理を実行して、事前定義されたエラーページにジャンプして、より良いユーザーエクスペリエンスを提供できます。
実稼働環境で何かをデバッグする必要がある場合に、それを使用しているユーザーに影響を与えたくない場合に、デバッグ ツールとして使用できます。
set_error_handler の使用法は次のとおりです:

コードをコピーします コードは次のとおりです:

string set_error_handler (callback error_handler [, int error_types])

次に、カスタム エラー処理を使用してフィルタリングします。実際のパス。変数 $admin があるとします。これを使用して、訪問者が管理者であるかどうかを判断します (この判断は IP またはログイン ユーザー ID によって行うことができます)
コードをコピーします コードは次のとおりです:

//admin 管理者の身元判断であり、真は管理者です。
//カスタム エラー処理関数には、これら 4 つの入力変数 $errno、$errstr、$errfile、$errline が必要です。そうでない場合は無効になります。
function my_error_handler($errno,$errstr,$errfile,$errline)
{
//管理者でない場合は実際のパスをフィルタリングします
if(!admin)
{
$errfile=str_replace(getcwd()," ", { $errno] $errstr (行: $errfile の $errline) n";
echo "プログラムの実行が停止しました。管理者に問い合わせてください。"; echo "警告 : [ID $errno] $errstr (行: $errline of $errfile) n";


これがカスタマイズ方法です。エラー処理関数を作成した場合、エラー処理をこのカスタム関数にどのように引き継ぎますか?



コードをコピーします

コードは次のとおりです:


//クラスに適用します
set_error_handler(array(&$this,"appError"));

//アプローチの例
set_error_handler("my_error_handler) ");


とても簡単です。このようにして、セキュリティとデバッグの利便性の間の矛盾をうまく解決できます。また、Web サイトのスタイルに合わせてエラー メッセージをより美しくすることも考えられます。
オリジナルの作成者は、私たちの同胞の注意を引くことを願って、注意が必要な 2 つの点をここに投稿します。
1. E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、および E_COMPILE_WARNING は、このハンドルでは処理されません。つまり、最もオリジナルな方法で表示されます。ただし、これらのエラーはコンパイル エラーまたは PHP カーネル エラーによって発生するものであり、通常の状況では発生しません。
2. set_error_handler()を使用した後は、error_reporting()が無効になります。つまり、すべてのエラー (上記のエラーを除く) は、処理のためにカスタム関数に渡されます。
最後に例を示します
コードをコピーします コードは次のとおりです:

//最初に関数を定義するか、他のファイルで定義してからrequire()で呼び出すこともできます
function myErrorHandler($errno, $ errstr, $errfile, $errline)
{
//安全のため、実際の物理パスは公開されず、次の 2 行で実際のパスをフィルタリングします
$errfile=str_replace(getcwd( ),"",$errfile);
right $errstr =str_replace(getcwd(),"",$errstr);

switch ($errno) {
case E_USER_ERROR:

echo "私のエラー エコー "不明なエラー タイプ : [$errno] $errstr
n"; Break; MYSQL ポートを意図的に 3333 と指定しましたが、実際には 3306 です。
$link_id=@mysql_pconnect("localhost:3333","root","password");
set_error_handler(myErrorHandler);
if (!$link_id) {
trigger_error("エラーが発生しました", E_USER_ERROR);





http://www.bkjia.com/PHPjc/825122.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/825122.html

技術記事

プログラムを作成すると、必ず問題が発生します (頻繁に問題が発生します)。PHP でエラーが発生すると、エラー スクリプトの場所、行番号、および理由が表示されます。多くの人はこれは何でもないと言います...





声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。