検索
ホームページバックエンド開発PHPチュートリアルさまざまな PHP エラーや例外をインターセプトし、致命的な例外が発生した場合は警告し、発生する前に予防措置を講じます。

さまざまな PHP 例外とエラーを傍受し、致命的なエラーが発生したときに警告し、問題が発生する前に防止します

日常の開発では、ほとんどの人のアプローチは、開発環境でデバッグ モードを有効にし、運用環境モデルでのデバッグをオフにすることです。 。開発中にさまざまなエラーや例外を確認できますが、オンラインではエラー表示をオフにします。

上記の状況は非常に安全であると説明する人もいますが、他の人はエラーを認識できず、重要な情報の漏洩を避けることができます...

しかし、このような状況に遭遇したことがありますか?オフラインでは正常でしたが、オンラインになると実行できなくなり、原因がわかりませんでした...

スクリプトは長時間問題なく実行されていましたが、ある日突然停止しました。何も起こらなかった。記録がない理由はありません...

他の人は明らかに支払いましたが、私たちはそれを自分で実験してみるのは良いことです...

上記のすべては、誰もがエラー メッセージをオフにし、エラーや例外をログに記録できず、ランダムに発生するエラーを追跡することが困難になっていることが原因です。これにより、エラーが表示されないだけでなく、エラーが追跡されるという矛盾が生じます。これはどのように実現されるのでしょうか。

上記の問題は、PHP のエラーおよび例外メカニズムとその組み込み関数 'set_Exception_handler'、'set_error_handler'、'register_shutdown_function'

'set_Exception_handler' を通じて実現できます。この関数は、捕捉されなかったさまざまな例外をインターセプトし、それらをユーザー定義のメソッドに渡して処理するために使用されます

「set_error_handler」関数は、さまざまなエラーをインターセプトして、それらをユーザー定義のメソッドに引き渡すことができます。処理

「register_shutdown_function」関数は、PHP スクリプトの最後に呼び出される関数です。「error_get_last」を使用すると、最後の致命的なエラーを取得できます

このアイデアは次のとおりです。通常、エラーと例外を組み合わせると、致命的なエラーがインターセプトされ、処理のためにカスタム メソッドに渡されます。致命的である場合は、それらをデータベースまたはファイル システムに記録し、スクリプトを使用して継続的にスキャンします。重大なエラーが見つかった場合は、すぐに電子メールまたはテキスト メッセージを送信して警告します。

まず、エラーと例外をインターセプトして処理するために使用されるエラー インターセプト クラスを定義します。このクラスは、「errorHandler.class.php」という名前のファイルに次のようなコードを記述します。

<span style="color: #008000;">/*</span><span style="color: #008000;">* * 文件名称:baseErrorHandler.class.php * 摘    要:错误拦截器父类 </span><span style="color: #008000;">*/</span><span style="color: #0000ff;">require</span> 'errorHandlerException.class.php';<span style="color: #008000;">//</span><span style="color: #008000;">异常类</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> errorHandler{    </span><span style="color: #0000ff;">public</span> <span style="color: #800080;">$argvs</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">();    </span><span style="color: #0000ff;">public</span>     <span style="color: #800080;">$memoryReserveSize</span> = 262144;<span style="color: #008000;">//</span><span style="color: #008000;">备用内存大小</span>    <span style="color: #0000ff;">private</span> <span style="color: #800080;">$_memoryReserve</span>;<span style="color: #008000;">//</span><span style="color: #008000;">备用内存</span>    <span style="color: #008000;">/*</span><span style="color: #008000;">*     * 方      法:注册自定义错误、异常拦截器     * 参      数:void     * 返      回:void     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> register()    {        </span><span style="color: #008080;">ini_set</span>('display_errors', 0<span style="color: #000000;">);        </span><span style="color: #008080;">set_exception_handler</span>(<span style="color: #0000ff;">array</span>(<span style="color: #800080;">$this</span>, 'handleException'));<span style="color: #008000;">//</span><span style="color: #008000;">截获未捕获的异常</span>        <span style="color: #008080;">set_error_handler</span>(<span style="color: #0000ff;">array</span>(<span style="color: #800080;">$this</span>, 'handleError'));<span style="color: #008000;">//</span><span style="color: #008000;">截获各种错误 此处切不可掉换位置        //留下备用内存 供后面拦截致命错误使用</span>        <span style="color: #800080;">$this</span>->memoryReserveSize > 0 && <span style="color: #800080;">$this</span>->_memoryReserve = <span style="color: #008080;">str_repeat</span>('x', <span style="color: #800080;">$this</span>-><span style="color: #000000;">memoryReserveSize);        </span><span style="color: #008080;">register_shutdown_function</span>(<span style="color: #0000ff;">array</span>(<span style="color: #800080;">$this</span>, 'handleFatalError'));<span style="color: #008000;">//</span><span style="color: #008000;">截获致命性错误</span><span style="color: #000000;">    }    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * 方      法:取消自定义错误、异常拦截器     * 参      数:void     * 返      回:void     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> unregister()    {        </span><span style="color: #008080;">restore_error_handler</span><span style="color: #000000;">();        </span><span style="color: #008080;">restore_exception_handler</span><span style="color: #000000;">();    }    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * 方      法:处理截获的未捕获的异常     * 参      数:Exception $exception     * 返      回:void     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> handleException(<span style="color: #800080;">$exception</span><span style="color: #000000;">)    {        </span><span style="color: #800080;">$this</span>-><span style="color: #000000;">unregister();        </span><span style="color: #0000ff;">try</span><span style="color: #000000;">        {            </span><span style="color: #800080;">$this</span>->logException(<span style="color: #800080;">$exception</span><span style="color: #000000;">);            </span><span style="color: #0000ff;">exit</span>(1<span style="color: #000000;">);        }        </span><span style="color: #0000ff;">catch</span>(<span style="color: #0000ff;">Exception</span> <span style="color: #800080;">$e</span><span style="color: #000000;">)        {            </span><span style="color: #0000ff;">exit</span>(1<span style="color: #000000;">);        }    }    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * 方      法:处理截获的错误     * 参      数:int     $code 错误代码     * 参      数:string $message 错误信息     * 参      数:string $file 错误文件     * 参      数:int     $line 错误的行数     * 返      回:boolean     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> handleError(<span style="color: #800080;">$code</span>, <span style="color: #800080;">$message</span>, <span style="color: #800080;">$file</span>, <span style="color: #800080;">$line</span><span style="color: #000000;">)    {        </span><span style="color: #008000;">//</span><span style="color: #008000;">该处思想是将错误变成异常抛出 统一交给异常处理函数进行处理</span>        <span style="color: #0000ff;">if</span>((<span style="color: #008080;">error_reporting</span>() & <span style="color: #800080;">$code</span>) && !<span style="color: #008080;">in_array</span>(<span style="color: #800080;">$code</span>, <span style="color: #0000ff;">array</span>(<span style="color: #ff00ff;">E_NOTICE</span>, <span style="color: #ff00ff;">E_WARNING</span>, <span style="color: #ff00ff;">E_USER_NOTICE</span>, <span style="color: #ff00ff;">E_USER_WARNING</span>,<span style="color: #000000;"> E_DEPRECATED)))        {</span><span style="color: #008000;">//</span><span style="color: #008000;">此处只记录严重的错误 对于各种WARNING NOTICE不作处理</span>            <span style="color: #800080;">$exception</span> = <span style="color: #0000ff;">new</span> errorHandlerException(<span style="color: #800080;">$message</span>, <span style="color: #800080;">$code</span>, <span style="color: #800080;">$code</span>, <span style="color: #800080;">$file</span>, <span style="color: #800080;">$line</span><span style="color: #000000;">);            </span><span style="color: #800080;">$trace</span> = <span style="color: #008080;">debug_backtrace</span><span style="color: #000000;">(DEBUG_BACKTRACE_IGNORE_ARGS);            </span><span style="color: #008080;">array_shift</span>(<span style="color: #800080;">$trace</span>);<span style="color: #008000;">//</span><span style="color: #008000;">trace的第一个元素为当前对象 移除</span>            <span style="color: #0000ff;">foreach</span>(<span style="color: #800080;">$trace</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$frame</span><span style="color: #000000;">)             {                </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$frame</span>['function'] == '__toString'<span style="color: #000000;">)                 {</span><span style="color: #008000;">//</span><span style="color: #008000;">如果错误出现在 __toString 方法中 不抛出任何异常</span>                    <span style="color: #800080;">$this</span>->handleException(<span style="color: #800080;">$exception</span><span style="color: #000000;">);                    </span><span style="color: #0000ff;">exit</span>(1<span style="color: #000000;">);                }            }            </span><span style="color: #0000ff;">throw</span> <span style="color: #800080;">$exception</span><span style="color: #000000;">;        }        </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;    }    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * 方      法:截获致命性错误     * 参      数:void     * 返      回:void     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> handleFatalError()    {        </span><span style="color: #0000ff;">unset</span>(<span style="color: #800080;">$this</span>->_memoryReserve);<span style="color: #008000;">//</span><span style="color: #008000;">释放内存供下面处理程序使用</span>        <span style="color: #800080;">$error</span> = error_get_last();<span style="color: #008000;">//</span><span style="color: #008000;">最后一条错误信息</span>        <span style="color: #0000ff;">if</span>(errorHandlerException::isFatalError(<span style="color: #800080;">$error</span><span style="color: #000000;">))        {</span><span style="color: #008000;">//</span><span style="color: #008000;">如果是致命错误进行处理</span>            <span style="color: #800080;">$exception</span> = <span style="color: #0000ff;">new</span> errorHandlerException(<span style="color: #800080;">$error</span>['message'], <span style="color: #800080;">$error</span>['type'], <span style="color: #800080;">$error</span>['type'], <span style="color: #800080;">$error</span>['file'], <span style="color: #800080;">$error</span>['line'<span style="color: #000000;">]);            </span><span style="color: #800080;">$this</span>->logException(<span style="color: #800080;">$exception</span><span style="color: #000000;">);            </span><span style="color: #0000ff;">exit</span>(1<span style="color: #000000;">);        }    }    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * 方      法:获取服务器IP     * 参      数:void     * 返      回:string     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">final</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> getServerIp()    {        </span><span style="color: #800080;">$serverIp</span> = ''<span style="color: #000000;">;        </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$_SERVER</span>['SERVER_ADDR'<span style="color: #000000;">]))        {            </span><span style="color: #800080;">$serverIp</span> = <span style="color: #800080;">$_SERVER</span>['SERVER_ADDR'<span style="color: #000000;">];        }        </span><span style="color: #0000ff;">elseif</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$_SERVER</span>['LOCAL_ADDR'<span style="color: #000000;">]))        {            </span><span style="color: #800080;">$serverIp</span> = <span style="color: #800080;">$_SERVER</span>['LOCAL_ADDR'<span style="color: #000000;">];        }        </span><span style="color: #0000ff;">elseif</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$_SERVER</span>['HOSTNAME'<span style="color: #000000;">]))        {            </span><span style="color: #800080;">$serverIp</span> = <span style="color: #008080;">gethostbyname</span>(<span style="color: #800080;">$_SERVER</span>['HOSTNAME'<span style="color: #000000;">]);        }        </span><span style="color: #0000ff;">else</span><span style="color: #000000;">        {            </span><span style="color: #800080;">$serverIp</span> = <span style="color: #008080;">getenv</span>('SERVER_ADDR'<span style="color: #000000;">);        }                        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$serverIp</span><span style="color: #000000;">;     }    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * 方      法:获取当前URI信息     * 参      数:void     * 返      回:string $url     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> getCurrentUri()    {        </span><span style="color: #800080;">$uri</span> = ''<span style="color: #000000;">;        </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$_SERVER</span> ["REMOTE_ADDR"<span style="color: #000000;">])        {</span><span style="color: #008000;">//</span><span style="color: #008000;">浏览器浏览模式</span>            <span style="color: #800080;">$uri</span> = 'http://' . <span style="color: #800080;">$_SERVER</span>['SERVER_NAME'] . <span style="color: #800080;">$_SERVER</span>['REQUEST_URI'<span style="color: #000000;">];        }        </span><span style="color: #0000ff;">else</span><span style="color: #000000;">        {</span><span style="color: #008000;">//</span><span style="color: #008000;">命令行模式</span>            <span style="color: #800080;">$params</span> = <span style="color: #800080;">$this</span>-><span style="color: #000000;">argvs;            </span><span style="color: #800080;">$uri</span> = <span style="color: #800080;">$params</span>[0<span style="color: #000000;">];            </span><span style="color: #008080;">array_shift</span>(<span style="color: #800080;">$params</span><span style="color: #000000;">);            </span><span style="color: #0000ff;">for</span>(<span style="color: #800080;">$i</span> = 0, <span style="color: #800080;">$len</span> = <span style="color: #008080;">count</span>(<span style="color: #800080;">$params</span>); <span style="color: #800080;">$i</span> $len; <span style="color: #800080;">$i</span>++<span style="color: #000000;">)            {                </span><span style="color: #800080;">$uri</span> .= ' ' . <span style="color: #800080;">$params</span>[<span style="color: #800080;">$i</span><span style="color: #000000;">];            }        }        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$uri</span><span style="color: #000000;">;    }    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * 方      法:记录异常信息     * 参      数:errorHandlerException $e 错误异常     * 返      回:boolean 是否保存成功     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">final</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> logException(<span style="color: #800080;">$e</span><span style="color: #000000;">)    {        </span><span style="color: #800080;">$error</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">(                        </span>'add_time'     =>     <span style="color: #008080;">time</span>(),                        'title'     =>     errorHandlerException::getName(<span style="color: #800080;">$e</span>->getCode()),<span style="color: #008000;">//</span><span style="color: #008000;">这里获取用户友好型名称</span>                        'message'     =>     <span style="color: #0000ff;">array</span>(),                        'server_ip' =>     <span style="color: #800080;">$this</span>->getServerIp(),                        'code'         =>     errorHandlerException::getLocalCode(<span style="color: #800080;">$e</span>->getCode()),<span style="color: #008000;">//</span><span style="color: #008000;">这里为各种错误定义一个编号以便查找</span>                        'file'         =>  <span style="color: #800080;">$e</span>->getFile(),                        'line'         =>     <span style="color: #800080;">$e</span>->getLine(),                        'url'        =>  <span style="color: #800080;">$this</span>->getCurrentUri(),<span style="color: #000000;">                    );        </span><span style="color: #0000ff;">do</span><span style="color: #000000;">        {            </span><span style="color: #008000;">//</span><span style="color: #008000;">$e->getFile() . ':' . $e->getLine() . ' ' . $e->getMessage() . '(' . $e->getCode() . ')'</span>            <span style="color: #800080;">$message</span> = (<span style="color: #0000ff;">string</span>)<span style="color: #800080;">$e</span><span style="color: #000000;">;            </span><span style="color: #800080;">$error</span>['message'][] = <span style="color: #800080;">$message</span><span style="color: #000000;">;        } </span><span style="color: #0000ff;">while</span>(<span style="color: #800080;">$e</span> = <span style="color: #800080;">$e</span>-><span style="color: #000000;">getPrevious());        </span><span style="color: #800080;">$error</span>['message'] = <span style="color: #008080;">implode</span>("\r\n", <span style="color: #800080;">$error</span>['message'<span style="color: #000000;">]);        </span><span style="color: #800080;">$this</span>->logError(<span style="color: #800080;">$error</span><span style="color: #000000;">);    }    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * 方      法:记录异常信息     * 参      数:array $error = array(     *                                    'time' => int,      *                                    'title' => 'string',      *                                    'message' => 'string',      *                                    'code' => int,     *                                    'server_ip' => 'string'     *                                     'file'     =>  'string',     *                                    'line' => int,     *                                    'url' => 'string',     *                                );     * 返      回:boolean 是否保存成功     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> logError(<span style="color: #800080;">$error</span><span style="color: #000000;">)    {        </span><span style="color: #008000;">/*</span><span style="color: #008000;">这里去实现如何将错误信息记录到日志</span><span style="color: #008000;">*/</span><span style="color: #000000;">    }}</span>
上記のコードには、ファイル「errorHandlerException.class .php」に配置される「errorHandlerException」クラス。このクラスは、エラーが発生したファイル、行番号、エラーコード、エラーメッセージ、その他の情報を記録するためにエラーを例外に変換するために使用されます。同時に、そのメソッド「isFatalError」は、エラーが致命的なエラーであるかどうかを識別するために使用されます。ここでは、管理しやすいようにエラーに番号を付け、名前を付けます。このクラスのコードは次のとおりです。

<span style="color: #008000;">/*</span><span style="color: #008000;">* * 文件名称:errorHandlerException.class.php * 摘    要:自定义错误异常类 该类继承至PHP内置的错误异常类 </span><span style="color: #008000;">*/</span><span style="color: #0000ff;">class</span> errorHandlerException <span style="color: #0000ff;">extends</span><span style="color: #000000;"> ErrorException{    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #800080;">$localCode</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">(                                        </span><span style="color: #ff00ff;">E_COMPILE_ERROR</span> => 4001,                                        <span style="color: #ff00ff;">E_COMPILE_WARNING</span> => 4002,                                        <span style="color: #ff00ff;">E_CORE_ERROR</span> => 4003,                                        <span style="color: #ff00ff;">E_CORE_WARNING</span> => 4004,<span style="color: #000000;">                                        E_DEPRECATED </span>=> 4005,                                        <span style="color: #ff00ff;">E_ERROR</span> => 4006,                                        <span style="color: #ff00ff;">E_NOTICE</span> => 4007,                                        <span style="color: #ff00ff;">E_PARSE</span> => 4008,<span style="color: #000000;">                                        E_RECOVERABLE_ERROR </span>=> 4009,                                        <span style="color: #ff00ff;">E_STRICT</span> => 4010,<span style="color: #000000;">                                        E_USER_DEPRECATED </span>=> 4011,                                        <span style="color: #ff00ff;">E_USER_ERROR</span> => 4012,                                        <span style="color: #ff00ff;">E_USER_NOTICE</span> => 4013,                                        <span style="color: #ff00ff;">E_USER_WARNING</span> => 4014,                                        <span style="color: #ff00ff;">E_WARNING</span> => 4015,                                        4016 => 4016,<span style="color: #000000;">                                    );    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #800080;">$localName</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">(                                        </span><span style="color: #ff00ff;">E_COMPILE_ERROR</span> => 'PHP Compile Error',                                        <span style="color: #ff00ff;">E_COMPILE_WARNING</span> => 'PHP Compile Warning',                                        <span style="color: #ff00ff;">E_CORE_ERROR</span> => 'PHP Core Error',                                        <span style="color: #ff00ff;">E_CORE_WARNING</span> => 'PHP Core Warning',<span style="color: #000000;">                                        E_DEPRECATED </span>=> 'PHP Deprecated Warning',                                        <span style="color: #ff00ff;">E_ERROR</span> => 'PHP Fatal Error',                                        <span style="color: #ff00ff;">E_NOTICE</span> => 'PHP Notice',                                        <span style="color: #ff00ff;">E_PARSE</span> => 'PHP Parse Error',<span style="color: #000000;">                                        E_RECOVERABLE_ERROR </span>=> 'PHP Recoverable Error',                                        <span style="color: #ff00ff;">E_STRICT</span> => 'PHP Strict Warning',<span style="color: #000000;">                                        E_USER_DEPRECATED </span>=> 'PHP User Deprecated Warning',                                        <span style="color: #ff00ff;">E_USER_ERROR</span> => 'PHP User Error',                                        <span style="color: #ff00ff;">E_USER_NOTICE</span> => 'PHP User Notice',                                        <span style="color: #ff00ff;">E_USER_WARNING</span> => 'PHP User Warning',                                        <span style="color: #ff00ff;">E_WARNING</span> => 'PHP Warning',                                        4016 => 'Customer`s Error',<span style="color: #000000;">                                    );    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * 方      法:构造函数     * 摘      要:相关知识请查看 http://php.net/manual/en/errorexception.construct.php     *        * 参      数:string        $message     异常信息(可选)     *              int         $code         异常代码(可选)     *              int         $severity     *              string     $filename     异常文件(可选)     *              int         $line         异常的行数(可选)     *           Exception  $previous   上一个异常(可选)     *     * 返      回:void     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> __construct(<span style="color: #800080;">$message</span> = '', <span style="color: #800080;">$code</span> = 0, <span style="color: #800080;">$severity</span> = 1, <span style="color: #800080;">$filename</span> = <span style="color: #ff00ff;">__FILE__</span>, <span style="color: #800080;">$line</span> = <span style="color: #ff00ff;">__LINE__</span>, <span style="color: #0000ff;">Exception</span> <span style="color: #800080;">$previous</span> = <span style="color: #0000ff;">null</span><span style="color: #000000;">)    {        parent</span>::__construct(<span style="color: #800080;">$message</span>, <span style="color: #800080;">$code</span>, <span style="color: #800080;">$severity</span>, <span style="color: #800080;">$filename</span>, <span style="color: #800080;">$line</span>, <span style="color: #800080;">$previous</span><span style="color: #000000;">);    }    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * 方      法:是否是致命性错误     * 参      数:array $error     * 返      回:boolean     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> isFatalError(<span style="color: #800080;">$error</span><span style="color: #000000;">)    {        </span><span style="color: #800080;">$fatalErrors</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">(                                </span><span style="color: #ff00ff;">E_ERROR</span>,                                 <span style="color: #ff00ff;">E_PARSE</span>,                                 <span style="color: #ff00ff;">E_CORE_ERROR</span>,                                <span style="color: #ff00ff;">E_CORE_WARNING</span>,                                 <span style="color: #ff00ff;">E_COMPILE_ERROR</span>,                                 <span style="color: #ff00ff;">E_COMPILE_WARNING</span><span style="color: #000000;">                            );        </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$error</span>['type']) && <span style="color: #008080;">in_array</span>(<span style="color: #800080;">$error</span>['type'], <span style="color: #800080;">$fatalErrors</span><span style="color: #000000;">);    }    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * 方      法:根据原始的错误代码得到本地的错误代码     * 参      数:int $code     * 返      回:int $localCode     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> getLocalCode(<span style="color: #800080;">$code</span><span style="color: #000000;">)    {        </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">isset</span>(self::<span style="color: #800080;">$localCode</span>[<span style="color: #800080;">$code</span>]) ? self::<span style="color: #800080;">$localCode</span>[<span style="color: #800080;">$code</span>] : self::<span style="color: #800080;">$localCode</span>[4016<span style="color: #000000;">];    }    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * 方      法:根据原始的错误代码获取用户友好型名称     * 参      数:int      * 返      回:string $name     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> getName(<span style="color: #800080;">$code</span><span style="color: #000000;">)    {        </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">isset</span>(self::<span style="color: #800080;">$localName</span>[<span style="color: #800080;">$code</span>]) ? self::<span style="color: #800080;">$localName</span>[<span style="color: #800080;">$code</span>] : self::<span style="color: #800080;">$localName</span>[4016<span style="color: #000000;">];    }</span>
エラーインターセプトクラスでは、ユーザーはエラー記録用の独自のメソッド ('logException') を定義する必要があることに注意する必要があります。一部のエラーは一定期間にわたって継続的に発生するため、エラー コード、ファイル、行番号、エラーの詳細を使用して MD5 値を生成し、記録する必要があります。指定された時間内 (1 時間) であれば、エラーは記録されています。すでに記録されている場合は、再度記録する必要はありません。

次に、次のファイルを定義します。上記のクラスをインスタンス化し、さまざまなエラーと例外をキャプチャします。ファイルの名前は次のように 'registerErrorHandler.php' です。

<span style="color: #008000;">/*</span><span style="color: #008000;">* 使用方法介绍:* 在入口处引入该文件即可,然后可以在该文件中定义调试模式常量'DEBUG_ERROR'** <?php *   *    require 'registerErrorHandler.php';*   * ?></span><span style="color: #008000;">*/</span><span style="color: #008000;">/*</span><span style="color: #008000;">** 调试错误模式:* 0                =>            非调试模式,不显示异常、错误信息但记录异常、错误信息* 1                =>            调试模式,显示异常、错误信息但不记录异常、错误信息</span><span style="color: #008000;">*/</span><span style="color: #008080;">define</span>('DEBUG_ERROR', 0<span style="color: #000000;">);</span><span style="color: #0000ff;">require</span> 'errorHandler.class.php'<span style="color: #000000;">;</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> registerErrorHandler{    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * 方      法:注册异常、错误拦截     * 参      数:void     * 返      回:void     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> register()    {        </span><span style="color: #0000ff;">global</span> <span style="color: #800080;">$argv</span><span style="color: #000000;">;        </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(DEBUG_ERROR)        {</span><span style="color: #008000;">//</span><span style="color: #008000;">如果开启调试模式</span>            <span style="color: #008080;">ini_set</span>('display_errors', 1<span style="color: #000000;">);            </span><span style="color: #0000ff;">return</span><span style="color: #000000;">;        }        </span><span style="color: #008000;">//</span><span style="color: #008000;">如果不开启调试模式</span>        <span style="color: #008080;">ini_set</span>('error_reporting', -1<span style="color: #000000;">);        </span><span style="color: #008080;">ini_set</span>('display_errors', 0<span style="color: #000000;">);        </span><span style="color: #800080;">$handler</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> errorHandler();        </span><span style="color: #800080;">$handler</span>->argvs = <span style="color: #800080;">$argv</span>;<span style="color: #008000;">//</span><span style="color: #008000;">此处主要兼容命令行模式下获取参数</span>        <span style="color: #800080;">$handler</span>-><span style="color: #000000;">register();    }    }registerErrorHandler</span>::register();
残りは、このファイルを環境に導入する必要があります。エントリ ファイルを作成し、デバッグ モードを定義し、エラーを記録する独自の方法を実装します

登録する前にいくつかのエラーが発生し、スクリプトが中断されましたが、記録できないことに注意してください。今回は、「registerErrorHandler::register()」がまだ実行されておらず、中断されました

また、「set_error_handler」関数は次のタイプのエラーをキャプチャできません:

E_ERRORE_PARSEE_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERRORE_COMPILE_WARNING, 这个可以在官方文档中看到,但是本处无妨,因为以上错误是解析、编译错误,这些都没有通过,你是不可能发布上线的

上記のコードは厳密にテストされ、オンライン環境に適用されています。必要に応じて変更できます。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
アクション中のPHP:実際の例とアプリケーションアクション中のPHP:実際の例とアプリケーションApr 14, 2025 am 12:19 AM

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHP:インタラクティブなWebコンテンツを簡単に作成しますPHP:インタラクティブなWebコンテンツを簡単に作成しますApr 14, 2025 am 12:15 AM

PHPにより、インタラクティブなWebコンテンツを簡単に作成できます。 1)HTMLを埋め込んでコンテンツを動的に生成し、ユーザー入力またはデータベースデータに基づいてリアルタイムで表示します。 2)プロセスフォームの提出と動的出力を生成して、XSSを防ぐためにHTMLSPECIALCHARSを使用していることを確認します。 3)MySQLを使用してユーザー登録システムを作成し、Password_HashおよびPreprocessingステートメントを使用してセキュリティを強化します。これらの手法を習得すると、Web開発の効率が向上します。

PHPとPython:2つの一般的なプログラミング言語を比較しますPHPとPython:2つの一般的なプログラミング言語を比較しますApr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPの永続的な関連性:それはまだ生きていますか?PHPの永続的な関連性:それはまだ生きていますか?Apr 14, 2025 am 12:12 AM

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

PHPの現在のステータス:Web開発動向を見てくださいPHPの現在のステータス:Web開発動向を見てくださいApr 13, 2025 am 12:20 AM

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

PHP対その他の言語:比較PHP対その他の言語:比較Apr 13, 2025 am 12:19 AM

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHP対Python:コア機能と機能PHP対Python:コア機能と機能Apr 13, 2025 am 12:16 AM

PHPとPythonにはそれぞれ独自の利点があり、さまざまなシナリオに適しています。 1.PHPはWeb開発に適しており、組み込みのWebサーバーとRich Functionライブラリを提供します。 2。Pythonは、簡潔な構文と強力な標準ライブラリを備えたデータサイエンスと機械学習に適しています。選択するときは、プロジェクトの要件に基づいて決定する必要があります。

PHP:Web開発の重要な言語PHP:Web開発の重要な言語Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター