日常の開発では、ほとんどの人が開発環境でデバッグ モードをオンにするアプローチをとります。本番環境ではデバッグモードをオフにします。開発中にさまざまなエラーや例外を確認できますが、オンラインではエラー表示をオフにします。
上記の状況は非常に科学的であるように見えますが、非常に安全であると説明する人もいれば、重要な情報が漏洩しないようにエラーが見えない人もいます...
しかし、オフラインでは正常に動作するのに、オンラインになると動作せず、原因が見つからないという状況に遭遇したことはありませんか?
スクリプトは長い間問題なく実行されていましたが、ある日突然停止し、その後何らかの理由で記録がなくなりました...他の人は明らかに支払いましたが、私たちはそれを自分で実験してみるのは良いことです...
上記のすべては、誰もがエラー メッセージをオフにし、エラーや例外をログに記録しなかったため、ランダムに発生するエラーを追跡することが困難になったためです。これにより、エラーが表示されないだけでなく、エラーが追跡されるという矛盾が生じます。これはどのように実現されるのでしょうか。
上記の問題は、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」という名前のファイルに配置され、コードは次のとおりです。 リーリー
上記のコードには、ファイル「errorHandlerException.class.php」に配置されている「errorHandlerException」クラスがあります。このクラスは、ファイル、行番号、エラーコードを記録するためにエラーを例外に変換するために使用されます。エラーが発生したエラーの情報とそのメソッド「isFatalError」を使用して、エラーが致命的なエラーであるかどうかを識別します。ここでは、管理の便宜のためにエラーに番号を付け、名前を付けます。このクラスのコードは以下の通りです
リーリーエラーインターセプトクラスでは、ユーザーはエラーを記録するための独自のメソッド (「logException」) を定義する必要があります。ここで、一部のエラーは一定期間にわたって継続的に発生する可能性があるため、記録する必要があるのは 1 回だけであることに注意してください。エラー コード、ファイル、行番号、およびエラーの詳細を使用して、エラーが記録されたかどうかを記録するための MD5 値を生成できます。指定された時間 (1 時間) 以内に記録された場合は、再度記録する必要はありません。
次に、上記のクラスをインスタンス化し、さまざまなエラーと例外をキャプチャするファイルを定義します。このファイルの名前は「registerErrorHandler.php」で、内容は次のとおりです。 リーリー
残りは、このファイルをエントリ ファイルに導入し、デバッグ モードを定義し、エラーを記録する独自の方法を実装する必要があります
登録前に発生し、スクリプトの中断を引き起こした一部のエラーは、この時点では「registerErrorHandler::register()」がまだ実行されておらず中断されているため、記録できないことに注意してください
また、「set_error_handler」関数は次のタイプのエラーをキャッチできません
E_ERROR
、 E_PARSE
、 E_CORE_ERROR
、 E_CORE_WARNING
、E_COMPILE_ERROR
、 E_COMPILE_WARNING, 这个可以在官方文档中看到,但是本处无妨,因为以上错误是解析、编译错误,这些都没有通过,你是不可能发布上线的
上記のコードは厳密にテストされ、オンライン環境に適用されています。必要に応じて変更できます。
http://www.bkjia.com/PHPjc/1093103.html
www.bkjia.com