14

非推奨の機能を利用する商用ソフトウェアを実行している実稼働サーバーがあります。php.ini でエラー出力を既に無効にしています -- display_errors = Off-- そのため、ユーザーにはこれらのエラーは表示されません。log_errors = Onただし、問題を追跡するために、まだ PHP エラーをログに記録しています。

error_reporting問題: PHP は、最終的にエラー ログに渡す内容に関して、ディレクティブを無視しているようです。どのような値の組み合わせを入力しても、I に設定されているかのようにファイルのログが記録されE_ALLます。その結果、私のエラーログは非推奨の通知で肥大化しています。

デフォルトのタイムゾーン値は php.ini に設定されているため、タイムゾーン関連の問題は関係ありません。

ソフトウェア パッケージのアップグレードはまだ利用できないため、「推奨されていないコードを修正するだけ」という推奨は行わないでください。ファイルロギングを完全に無効にすることなく、PHPが非推奨のエラーをログにダンプするのを防ぐ方法を特に探しています。

サーバーの詳細:

  • Ubuntu 10.04.2 LTS
  • PHP 5.3.2
4

3 に答える 3

25

PHP が Apache モジュールとして実行されている場合php.ini、Apache 構成ファイルのディレクティブを使用して、利用可能な構成設定にアクセスしたり変更したりできます。それらのディレクティブは...

  • php_value
  • php_flag
  • php_admin_value
  • php_admin_flag

php_*php_admin_*バージョンの違いがこの問題の鍵です。を使用して設定された値php_admin_valuephp_admin_flag、Apache グローバルおよび VirtualHost 構成でのみ設定できます。それらは.htaccess または ini.set() によってオーバーライドできません

error_reporting()関数は呼び出しに相当し、ini_set()同じ規則に該当します。

そこで、問題のサイトの仮想ホスト構成に入り、次の行を追加しました...

php_admin_value error_reporting 22527
php_admin_value error_log /custom/log/path/php_errors.log
php_admin_flag  log_errors On
php_admin_flag  display_errors Off
  1. 最初の行は のビットごとの値ですerror_reporting = E_ALL & ~E_DEPRECATED。簡単なスクリプトを作成して、この値を取得しました。

    ini_set("error_reporting", E_ALL & ~E_DEPRECATED);
    echo ini_get("error_reporting");
    

    非推奨アラートとともにシステム通知を無視する場合 -- error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE-- ビット単位の値は22519.

  2. 2 行目は、すべての PHP エラーをカスタム ログに送信します。デフォルトでは、PHP はsyslog通常、/var/log/apache2/error.logまたは同様の値を使用します。

  3. 3 行目は、ファイル ログを有効にします。

  4. 最後の 1 つは、ページ上のエラー表示をオフにします。

ここでも、操作の優先度と順序が重要です。これらの値は で定義された値php.iniよりも優先され、同時に、アプリケーション内または.htaccessファイル内の他の変更によってオーバーライドされることはありません。

php.ini の外で設定値を変更する方法の詳細については、PHP ドキュメントを参照してください。

于 2011-04-13T15:31:42.280 に答える
2

ソフトウェア自体がエラーレベルを設定している可能性があるため、 の設定を上書きしているようphp.iniです。

これが本当なら、あなたはSOLです。


ちなみに、Cactiをお使いの方はこちらをご覧ください。Cacti を使用していなくても、このシナリオはかなりうまくまとめられていると思います。

于 2011-04-11T22:31:00.310 に答える
-4

シンボルを使用して@警告を抑制することができます (カスタム エラー ハンドラーが使用されている場合を除く)。次に例を示します。

@unlink("http://something.bad/");

または:

@require_once('abc.pphp');

あるいは:

$var = @$_GET['something not set'];

とはいえ、これは賢明に使用する必要があり、簡単に問題が発生する可能性があり、デバッグが難しくなります。

于 2011-04-11T22:17:26.410 に答える