php のエラー処理は比較的複雑です。この記事では、PHP のエラー メカニズムを理解しやすくするために、PHP のエラーに関連する重要な知識ポイントをすべて説明します。
その前に、まず次のことを理解してください。 PHP エラーの基本
事前定義された定数
実行時設定
例外
エラー処理関数
ユーザーによって手動でスローされた
E_USER_NOTICE
、E_USER_WARNING
、E_USER_ERROR、<code>E_USER_DEPRECATED
原因はユーザーですE_NOTICE
、E_PARSE
、E_WARNING
、E_ERROR、<code>E_COMPILE_ERROR
、E_COMPILE_WARNING
、E_STRICT
、E_RECOVERABLE_ERROR
E_USER_NOTICE
, E_USER_WARNING
, E_USER_ERROR
, E_USER_DEPRECATED
用户造成的E_NOTICE
, E_PARSE
, E_WARNING
, E_ERROR
, E_COMPILE_ERROR
, E_COMPILE_WARNING
, E_STRICT
, E_RECOVERABLE_ERROR
php内核造成的E_CORE_ERROR
, E_CORE_WARNING
从是否终止程序执行的角度看, 可分为两类
终止程序执行
程序终止, 进入处理错误流程
不终止程序执行
产生错误, 但程序仍可以继续执行, 同样进入错误处理流程
对于PHP中的错误类型, 可以参考这篇更详细的文章--PHP的错误机制总结
手册--运行时配置讲解的很详细, 但有几个配置仍需特别注意
error_reporting
报告错误的类型, 建议在开发/测试环境配置成E_ALL
, 解决所有的类型的错误后, 在生产环境配置E_ALL & E_DEPRECATED
, 则表明:报告除废弃错误外的所有错误
display_errors
是否显示错误, 在生产环境中配置成false, 配合上面error_reporting
的设置, 则表明: 报告除废弃错误外的所有错误, 但不显示错误信息.
log_errors
错误记录是否开启, 生产环境需开启. 配合上面的两项配置, 则表明: 报告除废弃错误外的所有错误, 不显示错误信息, 但记录(只有php自己可以操作错误信息)到日志中.
error_log
指定错误的文件(syslog是特殊值).默认未被设置, 手册中:
如果该配置没有设置,则错误信息会被发送到 SAPI 错误记录器
一般情况下, 未设置会被记录到apache/nginx的错误日志中. 配合上面三项配置, 则表明: 报告除废弃错误外的所有错误, 不显示错误信息, 但记录到apache/nginx日志中.若配置了文件路径, 则表明: 报告除废弃错误外的所有错误, 不显示错误信息, 但记录到file_dir
日志中.
上面这几项配置影响着php错误最基本的表现.当然,这些配置可以通过 ini_set()
在代码中更改 或 php-fpm配置更改
错误函数并不多, 最应该关注的就是set_error_handler
和 set_exception_handler
, 因为通过它们可以介入错误/异常的处理流程.
上面提到过, 错误发生后, 都会进行错误处理流程, 那错误流程是如何定义的?
先看看php手册中的讲解: Errors
简单来说就是, 默认的处理流程就是通过配置完成, 但我们可以设置自定义的错误处理流程
上文提到过, 错误有两种, 那对于这种会终止脚本执行的错误如何处理?set_error_handler
E_CORE_ERROR
、E_CORE_WARNING
プログラムの終了実行
プログラムの終了、処理エラーに入る プロセス
- はプログラムの実行
- を終了せず、エラーを生成しますが、プログラムは引き続き実行でき、エラー処理プロセスに入ることができます🎜エラーの場合PHP の型については、この詳細な記事を参照してください。PHP エラー メカニズムの概要🎜🎜ランタイム設定🎜🎜マニュアル -- ランタイム設定について詳しく説明されていますが、特別な注意が必要な設定がいくつかあります🎜🎜🎜🎜
error_reporting
🎜報告されたエラーの種類、提案 開発/テスト環境でE_ALL
を構成し、すべての種類のエラーを解決します。運用環境では古いエラーを除くすべてのエラーが報告されます。🎜🎜🎜🎜display_errors
🎜 エラーを表示するかどうかは、運用環境で false に設定し、error_reporting
の設定と一致させます。上記は、古いエラーを除くすべてのエラーを報告することを意味します。ただし、エラー メッセージは表示されません 🎜🎜🎜🎜log_errors
🎜 エラー ログがオンになっているかどうかに関係なく、有効にする必要があります。運用環境 上記の 2 つの構成では、次のことを意味します: 廃止されたエラーを報告する ) 以外のすべてのエラーについては、マニュアルではデフォルトでは設定されていません: 🎜🎜🎜🎜。 この設定が設定されていない場合、エラー メッセージは SAPI エラー ロガーに送信されます🎜🎜🎜 一般 設定されていない場合、上記の 3 つの設定では、Apache/nginx エラー ログに記録されます。 、それは意味します: 廃止されたエラーを除くすべてのエラーを報告します。エラー メッセージは表示しませんが、apache/nginx ログに記録します。 ファイル パスが設定されている場合、それは次のことを意味します: 破棄されたエラーを除くすべてのエラーを報告します。エラー メッセージは表示されませんが、file_dir
ログに記録されます。🎜🎜上記の設定は、php エラーの最も基本的なパフォーマンスに影響します。もちろん、これらの設定はコード内で変更できます。ini_set()
または php-fpm 設定の変更🎜🎜エラー処理関数🎜🎜 エラー関数はそれほど多くはありませんが、ほとんどがすべきです。焦点はset_error_handler
とset_Exception_handler は、エラー/例外処理プロセスに介入できるためです 🎜🎜🎜 上で述べたように、エラーが発生した後、エラー処理プロセスが実行されますが、では、エラー処理はどのように定義されているのでしょうか?🎜🎜まず PHP マニュアルの説明を見てください: エラー🎜🎜 簡単に言うと<strong>デフォルトの処理プロセスは設定によって完了しますが、 カスタムのエラー処理プロセスを設定することができます</strong>🎜🎜🎜 対処方法スクリプトの実行を終了するエラーが発生しました🎜🎜上記のように、エラーには 2 種類あります。では、スクリプトの実行を終了するエラーにどのように対処すればよいでしょうか?🎜<code>set_error_handler
では、この種のエラーを処理できません。この点は簡単です。 🎜🎜この問題は基本的に次のように行われます (他の解決策はまだ見ていません): 🎜rreee🎜Exception🎜🎜 w3cPHP 例外処理によると 説明: 🎜🎜🎜例外処理は通常の処理を変更するために使用されます。指定されたエラー (例外) 状況が発生した場合のスクリプトのフロー。この状況を例外と呼びます。 🎜例外がトリガーされると、通常は次のことが起こります: 🎜🎜🎜🎜現在のコードの状態が保存されます🎜🎜🎜🎜コードの実行が事前定義された例外ハンドラー関数に切り替わります🎜状況に応じて、プロセッサは保存されたコード状態からコード実行を再開するか、スクリプト実行を終了するか、コードの外の場所からスクリプト実行を継続することがあります
キャッチされない例外によりスクリプト実行が終了し、E- ERROR エラーの場合は、定義された例外処理を実行します。そうでない場合は、PHP のデフォルトのエラー処理プロセスを続行します。つまり、ログに記録します。ただし、プログラミングの概念の観点から、例外とエラーはユーザーが予見できるものである必要があります。
上記のset_exception_handler
就是处理异常的, 用法与set_error_handler
一致. 在各框架中的异常处理很成熟, 大致都是在set_exception_handler
中将Exception
は、例外処理のユーザー制御の目的を達成するために、ユーザーが使用できる優れたインターフェイスを開きます。
PHP のエラー処理メカニズムは常に無視されますが、エラーのデバッグと監視に大きな役割を果たします。この記事は主に主要な知識ポイントを紹介し、まとめたものです。詳細を確認してください。詳細についてはマニュアルを参照してください。
定義済み定数
ランタイム設定
エラー処理関数
PHPエラーメカニズムの概要
例外
エラー
PHP例外処理
Symfonyデバッグ: これは完全なアプリケーションであり、できると言われていますエラー関連の知識ポイントをすべて網羅した包括的なチュートリアルとなるため、ソース コードを読むことをお勧めします。
以上がPHP エラー処理の問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。