ホームページ >类库下载 >PHP类库 >私たちが知る必要があるのは、PHP の間違った構成は何かということです。 PHPエラーメカニズムのまとめ

私たちが知る必要があるのは、PHP の間違った構成は何かということです。 PHPエラーメカニズムのまとめ

高洛峰
高洛峰オリジナル
2016-10-14 10:09:501277ブラウズ

再版するときは出典を示してください: PHP の間違った構成について何を知っておく必要がありますか? PHP のエラーメカニズムの概要 (再版)
// 厳格な基準: /tmp/php/index.php の 17 行目で変数のみが参照によって渡されるべきであるfunction change (&$var) {
$var += 10;
}


$var = 1;
change(++$var);// E_STRICT
E_RECOVERABLE_ERROR
このレベルは実際には ERROR レベルですが、エラー処理でキャプチャされない場合は、パフォーマンスがキャプチャされます。の E_ERROR と同じ。
仮パラメータで型を定義しているのに、呼び出し時に間違った型が渡された場合によく発生します。そのエラー リマインダーには、E_ERROR の致命的なエラーの前に Catachable という単語もあります。
//キャッチ可能な致命的なエラー: testCall() に渡される引数 1 は、A のインスタンス、指定された B のインスタンス、/tmp/php/index.php の 37 行目で呼び出され、/tmp/php/index.php で定義されている必要があります。 33 行目class A {
}class B {
}function testCall(A $a) {
}


$b = new B();
testCall($b);
E_DEPRECATED
このエラーは、An を使用したことを意味しますこの機能の古いバージョンとそれ以降のバージョンは無効になっているか、メンテナンスされていない可能性があります。
たとえば、curl の CURLOPT_POSTFIELDS は @FILENAME を使用してファイルをアップロードします
// 非推奨:curl_setopt(): ファイルのアップロードに @filename API を使用することは非推奨です。代わりに /tmp/php/index.php で CURLFile クラスを使用してください。 42行目$ch =curl_init("http://www.remotesite.com/upload.php");
curl_setopt($ch, CURLOPT_POSTFIELDS, array('fileupload' => '@'. "test")); E_CORE_ERROR、E_CORE_WARNING
これら 2 つのエラーは PHP エンジンによって生成され、PHP の初期化プロセス中に発生します。
E_COMPILE_ERROR、E_COMPILE_WARNING
これら 2 つのエラーは PHP エンジンによって生成され、コンパイル プロセス中に発生します。
E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE、E_USER_DEPRECATED、
これらのエラーはすべてユーザーによって引き起こされます。これは、try catch 例外を回避する良い方法です。
trigger_error("Cannot除算ゼロ", E_USER_ERROR);// E_USER_ERROR// E_USER_WARING// E_USER_NOTICE// E_USER_DEPRECATED
E_ALL
E_STRICT すべてのエラーおよび警告メッセージが出力されます。
エラー制御
phpには、エラーやエラーログの表示を制御できる設定やパラメータが多数あります。最初のステップとして、PHP の間違った設定は何なのかを知る必要があります。
php+php-fpm モデルに従っています。実際には、php エラーの表示に影響する 2 つの設定ファイルがあります。1 つは php 自体の設定ファイル php.ini で、もう 1 つは php-fpm の設定ファイルです。 php-fpm.conf。
php.iniでの設定
error_reporting = E_ALL // エラーレベル、どのレベルをレポートします error_log = /tmp/php_errors.log // phpでのエラー表示のログ位置 display_errors = On // 出力にエラーを表示するかどうか、この出力ページである場合もあれば、stdoutdisplay_startup_errors = On // 起動プロセスのエラー情報をページに表示するかどうかは、起動中に発生する上記のコア タイプのエラーがいくつかあることに注意してください。ページを表示します。 log_errors = On // エラー ログを記録するかどうか log_errors_max_len = 1024 // エラー ログの最大長ignore_repeat_errors = Off // 繰り返されるエラーを無視するかどうか track_errors = Off // グローバル変数 $php_errormsg を使用して最後のエラーを記録するかどうか xmlrpc_errors = 0 / /エラーを記録するために XML-RPC エラー メッセージ形式を使用するかどうか xmlrpc_error_number = 0 //XML-RPC の fastCode 要素の値として使用されます。 html_errors = On // 出力内の関数およびその他の情報を HTML リンクに変換するかどうか docref_root = http://manual/en/ // html_errors がオンの場合、このリンクのルート パスは何ですか fastcgi.logging = 0 // PHP エラーを fastcgi にスローするかどうか
よく尋ねられるのですが、error_reporting と display_errors の違いは何ですか?これら 2 つの機能はまったく異なります。
PHPはデフォルトでログと標準出力を行います(fpmモードの場合、標準出力はページです)
error_reportingのパラメータはエラーレベルです。どのレベルでエラーが発生するかを示します。すべてのエラー レベルでエラーをトリガーする必要がないことを PHP に指示した場合、ログにもページにもこのエラーは表示されません。これは何も起こっていないことと同じです。
display_errors は、エラー メッセージを標準出力に表示するかどうかを制御します。
log_errors は、エラー メッセージをログに記録するかどうかを制御します。
error_log はエラーログが表示される場所です。これは php-fpm で書き換えられることが多いため、cli と fpm のエラーログが同じファイルにないことがよくあります。
ignore_repeat_errors このマークは、次のプログラムのように、重複したログがある場合に 1 つだけが記録されるように制御します:
error_reporting(E_ALL);
ini_set('ignore_repeat_errors', 1);
ini_set('ignore_repeat_source', 1) ;$a = $c; $a = $c; //E_NOTICE
//注意: /tmp/php/index.php の 20 行目の未定義変数: c は 2 回表示されますが、現在は 2 回のみ表示されます。一度は起こります...
track_errors を有効にすると、最後のエラー情報が変数に保存されます。これは、ログを記録するときに役立つ可能性があります。しかし、それは本当に役に立たないと思います... html_errors と docref_root は非常にユーザーフレンドリーな設定であり、これら 2 つのパラメータを設定した後、返されるエラー メッセージにドキュメント内の情報が含まれている場合は、リンク形式になります。
error_reporting(E_ALL);ini_set('html_errors', 1);ini_set('docref_root', "https://secure.php.net/manual/zh/");include("a2.php"); E_WARNING
ページ表示:
これにより、エラーが発生した場所をすぐに見つけることができます。人間的ですね~
php-fpmの設定
error_log = /var/log/php-fpm/error.log // php-fpm自身のログ log_level = Notice // php-fpm自身のログレベル php_flag[ display_errors] = off // php.ini の設定変数をオーバーライドします。これは、プログラム内の ini_set によってオーバーライドできます。 php_value[display_errors] = off // php_flagphp_admin_value[error_log] と同じ = /tmp/www-error.log // php A を上書きします。 .ini の設定変数は、プログラム内の ini_set によって上書きできません。 php_admin_flag[log_errors] = on // php_admin_valuecatch_workers_output = yes // fpmworker の出力をキャプチャするかどうか request_slowlog_timeout = 0 // 遅いログの持続時間 throwlog = /var/log /php-fpm/www-slow.log // 遅いロギング
php-fpm の設定には error_log 設定もありますが、これは php.ini の error_log 設定とよく混同されます。ただし、記録される内容は異なります。php-fpm の error_log は、fpm の起動や終了など、php-fpm 自体のログのみを記録します。
php.iniのerror_logはphpプログラム自体を記録するエラーログです。
したがって、php-fpm の php.ini の error_log 設定を上書きするには、次の関数を使用する必要があります:
php_flag
php_value
php_admin_flag
php_admin_value
これらの 4 つの関数 admin の 2 つの関数は、この変数が設定された後は使用できないことを示します。 ini_set を使用して、コード内でこの変数を再割り当てします。 php_flag/value は引き続き php コードの ini_set に基づいています。
スローログは fpm によって記録されます。 request_slowlog_timeout 設定を使用して、スローログの期間を決定できます。
まとめ
私たちがよく混乱するのは、ログの問題と、特定のレベルのログがログに記録されない理由です。最も重要なことは、error_log、display_errors、log_errors の 3 つの構成を確認することです。ただし、構成を確認する際には、php.ini の構成と php- の構成を区別することにも注意する必要があります。 fpm.ini。

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

関連記事

続きを見る