php 500 エラーの解決策: 1. PHP スクリプトを確認して変更します; 2. 例外をキャプチャしてログに記録します; 3. ログを分析して処理します。
#この記事の動作環境: Windows 7 システム、PHP バージョン 7.1、Dell G3 コンピューター。
php 500 エラーの問題を解決するにはどうすればよいですか?
PHP と 500 エラー
PHP の実行中に頻繁にリターンが発生します。開発プロセス 500 エラーの状況であり、本文にデバッグ (利用可能な) コンテンツがありません。このとき、ゆっくりとデバッグする必要があります (ポイントをブレークしたり、デバッグ モードをオンにするなど) が、ライブ ネットワークの場合、このエラーはさらにイライラするものであり、ポイントをブレークしたり、デバッグ モードをオンにしたりするのは簡単ではありません。しかし、エラーなので解決策は必ずありますので、500 件の原因と解決策を段階的に分析してみましょう。
0x01、500 エラー
500 エラーは内部サーバー エラー (内部サービス エラー) とも呼ばれ、不明なエラーによりサービスがリクエストを処理できないことを意味します。 PHP サイトでは、通常、500 エラーは PHP によって返されます。つまり、500 エラーは通常、PHP スクリプトのエラーです。
php-fpm キャプチャ パケット 500
上の図 (Nginx PHP-FPM アーキテクチャ) からわかるように、存在しないクラスが呼び出されています。 PHP では、スクリプトが発生するとエラーが発生し、Nginx に 500 が返されます (エラー メッセージも返されますが、STDERR ではアンロードされます)。
0x02. 500 エラーの原因となるエラー例外は何ですか?
それでは、500 エラーの原因となるエラーの種類は何でしょうか? PHP のすべてのエラー レベルは、PHP の公式ドキュメント (http : //php.net/manual/zh/errorfunc.constants.php)、エラー レベルは E_ERROR、E_PARSE、E_RECOVERABLE_ERROR、E_USER_ERROR であり、キャッチされない例外などにより 500 個のエラーが発生します。
E_ERROR レベルのエラーにより 500
0x03 が発生します。どのような状況で上記の 500
が返されないのでしょうか。前述したように、これは PHP スクリプトのエラーが原因ですが、PHP スクリプトのエラーまたは例外によって確実に 500 が発生するのでしょうか?明らかにそうではありません。スクリプトに致命的なエラーがある場合でも、依然として 200 を返す可能性があります。
display_errors 設定オプション
Python、nodejs などに基づく Web アプリケーションでは、デフォルトで、例外が発生すると情報が出力されます。コンソール (STDERR/STDOUT)。 PHP-FPM アーキテクチャに基づく PHP では、印刷するコンソールがなく、その stderr と stdout は FastCGI の対応する STRDERR と STDOUT に設定されます。エラーが STDOUT にリダイレクトされる場合、エラーは応答に直接出力され、ステータス コードは 200 に設定されます。これは、display_errors オプションによって実現される機能でもあります。
display_errors オプションの構成は、ini_set を介して実装する必要があります。PHP ドキュメントの display_errors の構成は、値が文字列型であることを示しています。実際の使用では、数値とブール型もこの構成をオンにすることができますまたはオフ。
error_reporting 構成
display_errors は、PHP スクリプトでエラーが発生したときにエラーの詳細を表示するかどうか、およびエラー ステータス コードを返すかどうかを制御します。 error_reporting 項目は、どのレベルのエラーを直接印刷できるかを制御するために使用されます。
error_reporting の設定項目は error_reporting(E_ALL) または ini_set('error_reporting', E_ALL) で設定できます 関数パラメータの詳細については PHP ドキュメントを参照してください。
PHP 自体にはエラー ログ (2 つの設定項目 error_log と log_errors) があることに注意してください。エラーが発生すると、PHP はエラーをエラー ログに書き込み、どのエラーを書き込む必要があるかを示します。 error_reporting 項目によって制御されます。
エラー レベルが一致しない場合はエラーの詳細を表示しない
0x04、既存のネットワークで 500 を合理的に処理する方法
500 エラーの発生は、PHP スクリプトが正常に実行できないことを示しています。現時点でできることは、例外をキャプチャし、例外をログに記録して、将来のデバッグとライブ ネットワークの処理を容易にすることだけです。バグ。
PHP には独自のエラー ログが付属します
PHP 自体にはすでにエラー ログ レコードがあり、php.ini で log_errors を設定できます。この項目を On に設定し、error_log 設定項目と連携して、エラー ログの保存パスを指定します。
#エラー ログ スイッチ ログ パス設定このエラー ログの書き込みは、display_errors の影響を受けません。構成制御。つまり、display_errors がオンになっているかどうかに関係なく、エラーはログに記録されます。ただし、これは error_reporting 設定によって制御され、現在のエラー レベルが error_reporting のエラー レベルと一致しない場合、エラーはログに書き込まれません。つまり、エラー レベルが E_ERROR であっても、設定が error_reporting(E_NOTICE) である場合、E_ERROR エラー メッセージはログに表示されません。 #PHP エラー ログにはさまざまな種類のエラーが記録されます エラー レベルが一致しないため、ログは書き込まれませんエラー例外レコードのキャプチャ#PHP には、set_error_handler、register_shutdown_function、set_Exception_handler、error_get_last およびその他の関連するエラー処理関数が用意されています。取得したエラー情報を関数により指定したログに書き込むことでエラーの記録が可能です。
関数の使用方法の詳細については、http://km.oa.com/group/19368/articles/show/302491 を参照してください。テンプレートは次のとおりです:
$previousHandler = set_exception_handler(function(Exception $ex) use (&$previousHandler) { call_user_func('exceptionHandler', $ex, $previousHandler); }); set_error_handler('errorHandler'); register_shutdown_function('fatalErrorHandler'); function exceptionHandler(Exception $ex, $previousHandler) { $info = array( $ex->getFile(), $ex->getLine(), $ex->getCode(), $ex->getMessage() ); // 记录日志 logPHPError($info); if (isset($previousHandler) && is_callable($previousHandler)) { call_user_func($previousHandler, $ex); } } /** * 框架错误处理函数 * @param $errno * @param $errstr * @param $errfile * @param $errline * @return bool */ function errorHandler($errno = 0, $errstr = '', $errfile = '', $errline = 0) { switch ($errno) { case E_WARNING: $errname = 'E_WARNING'; break; case E_NOTICE: $errname = 'E_NOTICE'; break; case E_STRICT: $errname = 'E_STRICT'; break; case E_RECOVERABLE_ERROR: $errname = 'E_RECOVERABLE_ERROR'; break; case E_DEPRECATED: $errname = 'E_DEPRECATED'; break; case E_USER_ERROR: $errname = 'E_USER_ERROR'; break; case E_USER_WARNING: $errname = 'E_USER_WARNING'; break; case E_USER_NOTICE: $errname = 'E_USER_NOTICE'; break; case E_USER_DEPRECATED: $errname = 'E_USER_DEPRECATED'; break; default: restore_error_handler(); return false; } // 记录日志 $info = array( $errfile, $errline, $errname, $errstr ); logPHPError($info); restore_error_handler(); return false; } /** * Fatal error错误处理 */ function fatalErrorHandler() { if (($e = error_get_last()) && $e['type'] === E_ERROR) { $info = array( $e['file'], $e['line'], 'E_ERROR', $e['message'] ); // 记录日志 logPHPError($info); } }
要約すると、error_reporting はブラウザまたは PHP エラー ログに出力されるエラー情報のレベルを制御するために使用される関数または設定であり、display_errors はエラーおよび警告情報をブラウザまたは PHP エラー ログに出力するかどうかを制御します。ブラウザ。
PHP のエラー ログはグローバルであり、error_reporting によって制御されるため、独自のエラー (例外) キャプチャおよび記録ロジックをビジネスに実装することをお勧めします。
推奨学習: 「
PHP ビデオ チュートリアル以上がPHP 500エラーの問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。