Drupalのエラーメッセージ出力レベル

Drupalシステムのエラーメッセージ出力のコントロール方法について記載します。

DrupalはPHP言語を使用していますので、エラーメッセージのほぼすべてはPHPの出力メッセージだと思って問題ないと思います。
それにはデータベースへのアクセスも含まれます。
このPHPのエラーメッセージの出力はPHPの設定に左右されますが、DrupalのバージョンによってはさらにDrupalの管理画面からもコントロール可能な場合があります。

PHPの設定といえば「php.ini」がすぐに思い浮かびますが、それ以外にも設定が可能です。
たとえばDrupalでは「sites/*/settings」にPHPディレクティブの記載が確認できます。

そうなると自分のサイトでどこで設定したのが有効になっているのか?をまず把握する必要があると思います。
PHPの公開されているドキュメントをみれば設定方法を知ることはできますが、これはあくまで可能性の話であって実際には使用しているPHPがどのようなコンパイルオプションで作られたかで異なります。
そのため、使用しているPHPの情報はphpinfo()の結果で確認する必要があります。
このphpinfoの結果を確認すれば変更した内容が正しく反映されているかも把握できます。

1.phpinfoの実行
(1)Drupalの管理画面から実行
Drupal6のあるバージョンから管理画面のリンクボタンから実行できるようになりました。
Drupal6の場合:サイトの状態(admin/reports/status)からPHPのバージョンをクリックするか、直接【サイトURL】/admin/reports/status/phpをアドレスバーに入力
Drupal7の場合:サイトの状態(admin/reports/status)からPHP欄の詳細な情報をクリックするか、直接【サイトURL】/admin/reports/status/phpをアドレスバーに入力
(2)CLIから実行
サーバにリモートログインして、「php -i」コマンドでphpinfoの情報を標準出力に表示することが可能です。
CLIの場合は標準出力を「grep」、「sed」や「awk」などを使って整形したり検索するのが容易ですので必要な情報のみ取得するには便利です。
※実行しているphpのパスを確認しておかないとDrupalで使用しているphpとは別のものである可能性も考えられますので注意が必要です。
※パスの確認には「where php」もしくは「which php」などが使えます。
※さくらのレンタルサーバのPHPは「/usr/local/bin」です。
2.コンパイルオプションの確認
まず、使用しているPHPがどのような機能を有効無効にして作成されているかを確認します。ついでにバージョンも確認しておきます。
確認にはphpinfoを利用しますので、実行方法は1番を参考にしてください。

コンパイルオプション


※これ以降もphpinfoを利用しますので、phpinfoの出力結果の画面はそのままにしておいてください。

3.php.iniの確認
次に、どこに配置したphp.iniが有効になっているかを確認します。

php.iniの確認



4.ディレクティブの確認
エラーレポートに関するディレクティブはPHP coreになります。




5.エラーレベル
PHPのエラーは重要度で大別すると「ERROR(致命的)」、「WARNING(警告)」、「NOTICE(注目)」の3通りあり、さらにどの段階でのエラーかの種類にわかれます。
それらのエラーを「error_reporting」ディレクティブで設定することで意図するエラーを出力することが可能になります。
設定値は、数値と定数の2通りで指定が可能になっています。

PHPのバージョンアップとともにエラーの種類が増加し、それによりビット数も増加しました。そのためPHPバージョンによって使える定数や数値が異なります。
5.2の場合は14種類のエラー定数が定義されていますが、すべてのエラーは全ビットがON(1)の状態ですのでその1種類を除けば13ビットで表現できます。
よってすべてのエラー(全定数が1の場合)は8191(2の13乗-1)となります。
そこで、定数で用意されている「すべてのERROR(E_ALL)」はE_STRICT(12ビット目:2の11乗=2048)を除くすべてのエラーですので、E_ALLは6143(=8191-2048)となります。

仮に、E_NOTICEを除外(マスク)する場合は、4ビット目(2の3乗=8)をE_ALL(6143)から引いた数値6135となります。
※バージョンによってビット数がことなりますし定数の並び順が異なる場合があるので、数値で記述する場合はバージョン依存してしまうことを理解しておく必要があります。

これを演算子を使用して定数で表すと、E_ALL & ~E_NOTICEとなります。
この演算は以下の表のようになります。
定数 数値 E_ALL E_NOTICE ~E_NOTICE E_ALL & ~E_NOTICE
E_ERROR 1 1 0 1 1
E_WARNING 2 1 0 1 1
E_PARSE 4 1 0 1 1
E_NOTICE 8 1 1 0 0
E_CORE_ERROR 16 1 0 1 1
E_CORE_WARNING 32 1 0 1 1
E_COMPILE_ERROR 64 1 0 1 1
E_COMPILE_WARNING 128 1 0 1 1
E_USER_ERROR 256 1 0 1 1
E_USER_WARNING 512 1 0 1 1
E_USER_NOTICE 1024 1 0 1 1
E_STRICT 2048 0 0 1 0
E_RECOVERABLE_ERROR 4096 1 0 1 1
    E_STRICTのみ0 E_NOTICEのみ1 E_NOTICEの反転
(1は0、0は1)
E_ALLと~E_NOTICEとで両方が1の場合のみ1、それ以外は0
※1の箇所だけ左の数値を足し算すれば6035になります。
定数で表記したほうがバージョン依存はしないと思いますが、PHPで使用可能な演算子は限られています。
また一部のPHPバージョンでは演算子が使用できない場合があるようなので注意が必要です。

表の数値はそれぞれの定数の値を表しています。定数はそれぞれのビットに名前をつけたものです。(2の1乗~2の13乗)
エラーレベル一覧(PHP5.2)



6.エラー出力先
出力するエラーレベルを設定しましたが、それをどこ(標準出力、標準エラー出力、ファイル、ウェブサーバのログなど)に出力するかを指定します。
Drupal6の管理画面には、出力先としてメッセージとファイルの2通りがありました。
Drupal7の管理画面では、エラーレベルを選択するように変わっています。



以下は、PHPバージョン 5.2の場合です。




4.php.ini以外
PHPの設定は、PHPを導入したディレクトリの「lib」以下にあり、これがデフォルトの設定になります。
しかし、これもコンパイルオプションで変更が可能ですし、それ以外の設定ファイルの読み込みが可能になっています。
また、PHPはウェブサーバの設定に影響される部分もあるため、php.iniで設定したものがそのまま有効であるとは限りません。

以下、PHPの設定方法として考えられるものをあげます。
(1)php.ini
通常はPHP導入ディレクトリ以下にありますが、それ以外の場所にあるphp.iniも使用可能です。
たとえば、ウェブルートディレクトリ以下、Drupalルートディレクトリ以下などです。
(2)httpd.conf
Apacheなどのウェブサーバの設定ファイル(httpd.conf)でPHPに関する設定が可能です。
ただし、httpd.confはサーバ管理者の権限がなければ、ファイルの編集もウェブサーバのプロセスの再起動(変更の反映)の操作ができません。
さくらのレンタルサーバ(個人向け)の場合はサーバの管理者権限がありませんのでこの方法により設定変更はできませんが、httpd.confに記載があればもちろん有効になります。
※ウェブサーバの設定により有効にならない場合もあります。
(3).htaccess
ウェブサーバの設定で管理者権限がなくても編集できるのが各ディレクトリに配置した.htaccessファイルです。
このファイルにPHPの設定を記述することで有効にできる場合もあります。
※ウェブサーバの設定により有効にならない場合もあります。
(4)ini_set()関数
PHPプログラム内部でPHPの設定を宣言することが可能です。
プログラムごとに設定値を変更する必要がある場合に
(5)その他
Windowsの場合であれば、システムレジストリに設定することが可能です。
具体的なレジストリキーは[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z]になります。ここには、php.iniファイルのパスが設定されているケースがあるようです。
バージョンによってはphp.iniファイルの検索パスから最初に発見したファイルのみを使用する場合もあるようです。
またDrupalでは「sites/*/settings.php」(※*は通常allです)に設定が記述されていますが、これは(4)番のini_set()関数で有効にしているのかもしれません。





2.設定の優先順位
1番で記載した設定方法が重複している場合にどの設定が使われるのかが気がかりです。
これを知っておかないとせっかく設定をしても無意味になることも考えられます。

優先順位は、PHPのバージョンに左右されます。
PHP5.1以前は、設定を読み込む順序に従い設定ファイルを捜索し、最初に発見した設定を使うようです。
PHP5.2以降は、順番に上書きされていくようです。

優先順位はまず、設定ファイルを探索する場所とその順序、さらにはそれらをすべて探索するのか否か、そして追加なのか上書きなのかで決まります。
また、CLIで実行する場合とそうでない場合とでも探索する場所(1番の設定のどれか)が変わります。







3.ディレクティブ
設定方法と優先順位がわかれば、自分の環境でどこに設定をすればそれが反映されるかが把握できるようになりますので、あとはどんな設定が可能かを知る必要があります。
設定可能なディレクティブは、PHPのバージョンに左右されます。
使用可能なディレクティブの情報は、コンパイルしたときに作成されるphp.iniファイルを参照するのが確実と思います。
また、phpinfoにもphp.iniに関する情報が記載されています。

そもそもどの機能を有効にしどの機能を無効にしているかは、PHPに限らずプログラムのコンパイルオプションの指定で変わってきます。
そのため、実際に使用しているPHPがどのようなオプションを使用してコンパイルされたのかが重要になります。
ようするにプログラムのコンパイル時にPHPの仕様が決定されているということになりますので、ドキュメントにある記載はあくまで可能性を調査するためには使えますが実際の仕様はコンパイルした人にしかわかりません。ただ、PHPの場合はコンパイル時に生成されるphp.iniやphpinfoから情報が入手可能です。
これは、ディレクティブだけに限らず、優先順位や設定ファイルにも同じことが言えます。


4.エラーレベルの指定
PHPのエラーレベルを設定する場合、「error_report」ディレクッティブを

phpinfoによる現状のエラーレベルの確認



4.Drupal6とDrupal7の比較
Drupalの管理画面からエラーログの設定が可能です。
Drupal6の場合は、「エラー報告」(admin/settings/error-reporting)から行います。
ここで設定が可能な項目はエラーの出力先の変更のみです。
Drupal7の場合は、「ログとエラーメッセージ」(admin/config/development/logging)から行えます。
ここでは「なし」、「エラーと警告」、「すべて」のなかから設定が可能になっています。