ホームページ  >  記事  >  バックエンド開発  >  PHP 500エラーの問題を解決する方法

PHP 500エラーの問題を解決する方法

藏色散人
藏色散人オリジナル
2021-12-29 09:30:2912508ブラウズ

php 500 エラーの解決策: 1. PHP スクリプトを確認して変更します; 2. 例外をキャプチャしてログに記録します; 3. ログを分析して処理します。

PHP 500エラーの問題を解決する方法

#この記事の動作環境: Windows 7 システム、PHP バージョン 7.1、Dell G3 コンピューター。

php 500 エラーの問題を解決するにはどうすればよいですか?

PHP と 500 エラー

PHP の実行中に頻繁にリターンが発生します。開発プロセス 500 エラーの状況であり、本文にデバッグ (利用可能な) コンテンツがありません。このとき、ゆっくりとデバッグする必要があります (ポイントをブレークしたり、デバッグ モードをオンにするなど) が、ライブ ネットワークの場合、このエラーはさらにイライラするものであり、ポイントをブレークしたり、デバッグ モードをオンにしたりするのは簡単ではありません。しかし、エラーなので解決策は必ずありますので、500 件の原因と解決策を段階的に分析してみましょう。

0x01、500 エラー

500 エラーは内部サーバー エラー (内部サービス エラー) とも呼ばれ、不明なエラーによりサービスがリクエストを処理できないことを意味します。 PHP サイトでは、通常、500 エラーは PHP によって返されます。つまり、500 エラーは通常、PHP スクリプトのエラーです。

PHP 500エラーの問題を解決する方法

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 個のエラーが発生します。

PHP 500エラーの問題を解決する方法

E_ERROR レベルのエラーにより 500

0x03 が発生します。どのような状況で上記の 500

が返されないのでしょうか。前述したように、これは PHP スクリプトのエラーが原因ですが、PHP スクリプトのエラーまたは例外によって確実に 500 が発生するのでしょうか?明らかにそうではありません。スクリプトに致命的なエラーがある場合でも、依然として 200 を返す可能性があります。

PHP 500エラーの問題を解決する方法

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 の構成は、値が文字列型であることを示しています。実際の使用では、数値とブール型もこの構成をオンにすることができますまたはオフ。

PHP 500エラーの問題を解決する方法

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 項目によって制御されます。

PHP 500エラーの問題を解決する方法

エラー レベルが一致しない場合はエラーの詳細を表示しない

0x04、既存のネットワークで 500 を合理的に処理する方法

500 エラーの発生は、PHP スクリプトが正常に実行できないことを示しています。現時点でできることは、例外をキャプチャし、例外をログに記録して、将来のデバッグとライブ ネットワークの処理を容易にすることだけです。バグ。


PHP には独自のエラー ログが付属します

PHP 自体にはすでにエラー ログ レコードがあり、php.ini で log_errors を設定できます。この項目を On に設定し、error_log 設定項目と連携して、エラー ログの保存パスを指定します。

PHP 500エラーの問題を解決する方法

#エラー ログ スイッチ

PHP 500エラーの問題を解決する方法

ログ パス設定

このエラー ログの書き込みは、display_errors の影響を受けません。構成制御。つまり、display_errors がオンになっているかどうかに関係なく、エラーはログに記録されます。ただし、これは error_reporting 設定によって制御され、現在のエラー レベルが error_reporting のエラー レベルと一致しない場合、エラーはログに書き込まれません。つまり、エラー レベルが E_ERROR であっても、設定が error_reporting(E_NOTICE) である場合、E_ERROR エラー メッセージはログに表示されません。

PHP 500エラーの問題を解決する方法

#PHP エラー ログにはさまざまな種類のエラーが記録されます

PHP 500エラーの問題を解決する方法

エラー レベルが一致しないため、ログは書き込まれません

エラー例外レコードのキャプチャ

#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);
    }
}

0x05 概要

要約すると、error_reporting はブラウザまたは PHP エラー ログに出力されるエラー情報のレベルを制御するために使用される関数または設定であり、display_errors はエラーおよび警告情報をブラウザまたは PHP エラー ログに出力するかどうかを制御します。ブラウザ。

PHP のエラー ログはグローバルであり、error_reporting によって制御されるため、独自のエラー (例外) キャプチャおよび記録ロジックをビジネスに実装することをお勧めします。

推奨学習: 「

PHP ビデオ チュートリアル

以上がPHP 500エラーの問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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