PHP エラーと例外のログ記録

藏色散人
藏色散人転載
2019-09-21 09:48:113131ブラウズ

Nginx PHP サービスのエラー ログというと、通常、Nginx アクセス ログ、エラー ログ、PHP エラー ログが考えられます。非常に単純な質問に思えますが、実際にはアプリケーションの設定とログの記録場所が関係しており、apt-get を使用して ubuntu などのシステムにインストールすると、より合理的な独自の設定ファイルのセットが利用可能になります。さらに、実行中のアプリケーションの設定もログの方法と内容に影響します。

エラーと例外の違い

エラーと例外については、簡単な例を使用して理解できます。

<?php
try {
    1 / 0;
} catch (Exception $e) {
    echo "catched", PHP_EOL;
}

この小さな例を実行すると、 「PHP 警告: ゼロによる除算...」エラーが直接発​​生します。理由は簡単です。これは例外ではなく論理エラーであるため、try では捕捉できません。同様に、変数が使用前に定義されていない場合は、キャプチャされずに警告が生成されます。

しかし、この問題には PHP7 でいくつかの変更が加えられています。たとえば、上記の例では / を % に変更し、PHP7 環境で実行すると、別のプロンプトが表示されます:

PHP Fatal error: Uncaught DivisionByZeroError ...

このヒントに従って、catch の条件を変更すると、

<?php
try {
    1 / 0;
} catch (DivisionByZeroError $e) {
    echo "catched", PHP_EOL;
}

このようにして、エラーは正常にキャプチャされ、catch が出力されます。

最初の例では、Excepiton を ErrorException に変更すると正常にキャッチすることもできます。

PHP5 では剰余と除算が同じであるのに、PHP7 (私のテスト環境は 7.0.4) では除算が DivisionByZeroError 問題にならない理由については、これはバグのはずです。

ログ記録

PHP 自体には次の構成可能なログがあります:

# php-fpm エラー ログ (php-fpm.conf、起動を記録します)

#● php-fpm スロー ログ (これも php-fpm.conf で設定され、遅い実行を記録します)

● php エラー ログ (php で設定されます) .ini を使用してアプリケーション エラー ログを記録します)

さらに、Nginx には、アクセス ログとエラー ログという 2 つの構成可能なログもあります。これらのログファイルは機能が異なり、記録内容も異なります。ただし、注意すべき点が 1 つあります。php-fpm でエラー ログの場所が設定されているが、そのログの場所が書き込み可能ではない場合 (php-fpm は起動時に確認するため、場所は設定中に正しい必要があります)、適切な設定条件 エラー ログは CGI に返され、nginx のエラー ログに書き込まれます。

したがって、問題が発生したときの一般的な検索方法は次のとおりです:

1. Nginx アクセス ログでリクエストのステータス コードを確認します

2. PHP エラーを確認しますlog エラー レコードとスタック情報

3. 異常な再起動レコードがないか php-fpm ログを確認します (これは、コアまたは拡張機能に問題がある場合に発生します)

ただし、上記の状況では、次のことも行います。上記のプログラムによってスローされた例外のログ記録がないことがわかります。

例外レコード

例外はエラーとは異なります。厳密に言えば、これはエラーではなくアプリケーション ロジックの例外です。適切なプログラム ロジックを通じて手動でトリガーできます。 . .ただし、ほとんどの場合、データベースに接続できないことやフレームワークの不適切な使用によって引き起こされる例外など、例外も記録する必要があるため、ログを使用して問題を特定し、タイムリーに処理する必要があります。

PHP には、エラーおよび例外の処理メソッドをカスタマイズするための 2 つの関数が用意されています。

## ● set_error_handler

● set_Exception_handler

したがって、 set_Exception_handler 関数を使用できます。すべての例外をキャッチしてログに記録します。

monolog

は優れた例外記録ライブラリであり、 PSR-3 標準の実装にも基づいています。 Laravel と Symfony では例外を記録するためにデフォルトで使用されます。必要に応じて、独自のプロジェクトへの導入を検討することもできます。

以上がPHP エラーと例外のログ記録の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。