PHPのWarningとは、プログラムの実行中に問題が発生した際に出力される警告メッセージです。
WarningはE_WARNINGというエラーレベルに分類されます。
一般的に、Warningが発生しただけではPHPスクリプトの実行は直ちに停止しません。
ただし、Warningの原因によって関数がfalseを返したり、その後の処理で別の問題が発生したりする可能性があります。
そのため、Warningが表示されている場合は、単に非表示にするだけではなく、原因を確認して修正することが重要です。
PHPのWarningを非表示にする主な方法
PHPのWarningを非表示にする方法はいくつかあります。
代表的な方法は次のとおりです。
display_errorsを無効にするerror_reporting()でE_WARNINGを除外するphp.iniでエラー表示を設定する@エラー制御演算子を使用するset_error_handler()で独自にWarningを処理する
ただし、それぞれの方法は目的が異なります。
特に重要なのが、「Warningを画面から非表示にすること」と「Warningそのものを報告対象から除外すること」の違いです。
本番環境では、Warningそのものを無効化するのではなく、画面には表示せず、ログには記録する運用が一般的です。
display_errorsでWarningを画面から非表示にする方法
ini_set()でエラー表示を無効にする
PHPスクリプト内からエラー表示を無効にしたい場合は、ini_set()を利用できます。
<?php
ini_set('display_errors', '0');
この設定を行うと、Warningを含むPHPのエラー情報が画面に表示されなくなります。
ただし、display_errorsはWarningそのものを無効にする設定ではありません。
あくまで、PHPが検出したエラーをユーザーの画面に表示するかどうかを制御する設定です。
そのため、本番環境では次のような設定が適しています。
<?php
error_reporting(E_ALL);
ini_set('display_errors', '0');
ini_set('log_errors', '1');
この設定では、PHPのエラーをすべて報告対象にしたまま、ユーザーの画面には表示せず、ログに記録できます。
display_errorsを無効にするメリット
本番環境でdisplay_errorsを無効にする大きな理由は、セキュリティ対策です。
PHPのエラーメッセージには、サーバー上のファイルパスやプログラム内部の構造などが含まれる場合があります。
こうした情報が一般ユーザーに表示されると、攻撃者にシステム内部の情報を与えてしまう可能性があります。
そのため、本番環境ではエラーを画面に表示せず、管理者だけがログで確認できる状態にすることが重要です。
error_reporting()でWarningだけを除外する方法
E_WARNINGを報告対象から外す
Warningだけを報告対象から外したい場合は、error_reporting()を使用できます。
<?php
error_reporting(E_ALL & ~E_WARNING);
E_ALLは、PHPが扱う各種エラーをまとめて指定するための定数です。
そこからE_WARNINGを除外することで、Warningだけを報告対象から外せます。
つまり、次のような意味になります。
すべてのエラーを報告する
↓
E_WARNINGだけを除外する
Warning以外のエラーについては、引き続き報告対象になります。
WarningとNoticeを両方除外する
WarningとNoticeを両方除外したい場合は、次のように指定できます。
<?php
error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
または、次のようにまとめて記述することもできます。
<?php
error_reporting(E_ALL & ~(E_WARNING | E_NOTICE));
どちらも、E_WARNINGとE_NOTICEを報告対象から除外するという意味です。
ただし、開発環境でWarningやNoticeを安易に除外するのはおすすめできません。
不具合や実装ミスに気づきにくくなる可能性があるためです。
display_errorsとerror_reportingの違い
display_errorsは画面表示を制御する
display_errorsは、PHPが検出したエラーを画面に表示するかどうかを制御します。
例えば次の設定です。
ini_set('display_errors', '0');
この場合、Warning自体は発生しています。
ただし、画面には表示されません。
error_reportingは報告対象を制御する
一方、error_reporting()は、どのエラーレベルを報告対象にするかを制御します。
例えば次の設定です。
error_reporting(E_ALL & ~E_WARNING);
この場合、E_WARNINGそのものが報告対象から除外されます。
両者の違いを整理すると、次のようになります。
display_errors = Off
→ エラーは報告対象のままだが画面に表示しない
error_reporting(E_ALL & ~E_WARNING)
→ Warning自体を報告対象から除外する
本番環境では、通常はWarningを報告対象から除外するよりも、画面への表示だけを停止するほうが適切です。
php.iniでWarningを非表示にする方法
display_errorsをOffにする
サーバー全体の設定としてエラー表示を無効にしたい場合は、php.iniを変更します。
display_errors = Off
この設定により、PHPのエラーがブラウザなどの画面に表示されなくなります。
本番環境では一般的に推奨される設定です。
本番環境ではログも有効にする
本番環境では、エラーを表示しないだけではなく、ログに記録することが重要です。
代表的な設定は次のとおりです。
error_reporting = E_ALL
display_errors = Off
log_errors = On
この設定では、PHPがすべてのエラーを検出しながら、ユーザーには表示せず、サーバー側のログへ記録します。
考え方としては次のようになります。
すべてのエラーを検出する
↓
ユーザーには表示しない
↓
管理者が確認できるようログに残す
本番環境では、この構成を基本にするとよいでしょう。
php.iniでWarningだけを除外する
php.iniでWarningだけを報告対象から除外することも可能です。
error_reporting = E_ALL & ~E_WARNING
ただし、本番環境であっても、Warningを完全に無視することはあまりおすすめできません。
Warningはプログラム上の問題を知らせる重要な情報だからです。
基本的には次の設定のほうが適しています。
error_reporting = E_ALL
display_errors = Off
log_errors = On
@演算子で特定のWarningを抑制する方法
@エラー制御演算子とは
PHPには、特定の式から発生する診断エラーを抑制する@エラー制御演算子があります。
例えば、次のように使用できます。
<?php
$content = @file_get_contents('not-found.txt');
通常、存在しないファイルをfile_get_contents()で読み込もうとするとWarningが発生します。
しかし、式の前に@を付けることで、その式から発生する診断エラーを抑制できます。
@演算子は多用しない
@を付ければ簡単にWarningを見えなくできます。
しかし、問題の原因まで解決されるわけではありません。
例えば次のようなコードがあります。
$result = @some_function();
エラーを抑制するだけでは、処理が成功したかどうか判断できません。
そのため、戻り値も確認する必要があります。
$result = @some_function();
if ($result === false) {
// 失敗時の処理
}
@は限定的な用途では利用できますが、プログラム全体のエラー処理を@に頼るのは避けたほうがよいでしょう。
@を使っても独自エラーハンドラが呼ばれる場合がある
set_error_handler()で独自のエラーハンドラを登録している場合、@でエラーを抑制していてもエラーハンドラ自体は呼び出されます。
そのため、@を付ければすべてのエラー処理が完全に行われなくなるというわけではありません。
独自エラーハンドラを使用しているシステムでは、この挙動も理解しておく必要があります。
set_error_handler()でWarningを独自処理する方法
Warningだけを処理する
PHPでは、set_error_handler()を利用して独自のエラー処理を定義できます。
例えば次のように記述できます。
<?php
set_error_handler(function ($errno, $errstr) {
if ($errno === E_WARNING) {
error_log('Warning: ' . $errstr);
return true;
}
return false;
});
この例では、E_WARNINGが発生した場合にerror_log()でログへ記録しています。
return trueとreturn falseの違い
set_error_handler()では、コールバックの戻り値が重要です。
次のようにtrueを返した場合、
return true;
独自エラーハンドラ側で処理済みとして扱われ、通常のPHPエラーハンドラには処理を渡しません。
一方、次のようにfalseを返した場合、
return false;
PHP標準のエラー処理に委ねられます。
そのため、独自エラーハンドラを実装するときは、どのエラーを自分で処理し、どのエラーをPHP標準の処理へ戻すのかを明確にする必要があります。
set_error_handler()ですべてのエラーを処理できるわけではない
set_error_handler()は便利ですが、PHPのすべてのエラーを処理できるわけではありません。
例えば、次のようなエラーはユーザー定義エラーハンドラでは処理できません。
E_ERROR
E_PARSE
E_CORE_ERROR
E_CORE_WARNING
E_COMPILE_ERROR
E_COMPILE_WARNING
また、set_error_handler()を登録する前に発生したエラーも処理できません。
そのため、set_error_handler()だけにエラー管理を任せるのではなく、php.iniやログ設定と組み合わせて利用することが重要です。
開発環境ではWarningを表示したほうがよい
開発中はE_ALLを利用する
開発環境では、Warningを含むエラー情報を積極的に確認できる状態にしておくことをおすすめします。
例えば次のように設定します。
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
この設定では、PHPが報告対象とするエラーを幅広く確認できます。
Warningは、ファイル操作や配列、変数、外部リソースへのアクセスなどに問題があることを知らせている場合があります。
開発段階でWarningを隠してしまうと、不具合を見逃す原因になりかねません。
そのため、開発環境ではできるだけエラーを表示し、問題の原因を修正することが重要です。
本番環境では「非表示+ログ保存」が基本
Warning自体は報告対象に残す
本番環境でおすすめなのは、Warningを無効にすることではありません。
Warningを含むエラーを報告対象に残したまま、画面への表示だけを停止します。
代表的な設定は次のとおりです。
error_reporting = E_ALL
display_errors = Off
log_errors = On
PHPコード内で設定する場合は、次のように記述できます。
<?php
error_reporting(E_ALL);
ini_set('display_errors', '0');
ini_set('log_errors', '1');
この方法なら、ユーザーにはWarningを見せず、開発者や管理者はログから問題を確認できます。
php.iniで設定するほうが確実な場合もある
ini_set()を使用すればスクリプト内から設定を変更できます。
ただし、スクリプトが正常に実行される前に重大なエラーが発生した場合、ini_set()の処理そのものが実行されない場合があります。
そのため、本番環境の基本的なエラー設定は、可能であればphp.iniなどサーバー側の設定で管理するほうが確実です。
Warningは非表示にするだけでなく原因を修正する
ファイル読み込み時のWarningの例
例えば次のようなコードがあります。
<?php
$data = file_get_contents('data.txt');
対象のファイルが存在しなかったり、読み込めなかったりするとWarningが発生する可能性があります。
単純に次のようにしてWarningを隠すこともできます。
<?php
$data = @file_get_contents('data.txt');
しかし、これでは問題の原因が解決されたわけではありません。
用途によっては、事前に読み込み可能かどうか確認する方法があります。
<?php
$file = 'data.txt';
if (is_readable($file)) {
$data = file_get_contents($file);
} else {
$data = null;
}
ただし、事前確認を行えば必ず安全というわけではありません。
確認後にファイルの状態が変わる可能性もあるため、実際の処理結果も確認することが重要です。
<?php
$data = file_get_contents($file);
if ($data === false) {
// 読み込み失敗時の処理
}
重要なのは、Warningを単純に隠すのではなく、失敗時にどのような処理を行うかを設計することです。
PHPのWarningを非表示にするときの注意点
Warningを完全に無視しない
次の設定を行えば、Warningを報告対象から除外できます。
error_reporting(E_ALL & ~E_WARNING);
しかし、本番環境だからといってWarningを完全に無視する必要はありません。
Warningには、不具合や設定ミスを発見するための重要な情報が含まれている可能性があります。
基本的には、次のような構成にするのがおすすめです。
error_reporting(E_ALL);
ini_set('display_errors', '0');
ini_set('log_errors', '1');
Warningは検出しながら、ユーザーには表示せず、管理者がログで確認できる状態にします。
@演算子だけに頼らない
@は便利ですが、多用するとエラーの原因を追跡しにくくなります。
特に、
$result = @some_function();
とするだけでは、その関数が失敗したことに気づけない可能性があります。
@を使用する場合でも、戻り値やエラー条件を確認し、失敗時の処理を実装することが重要です。
PHPのWarningを非表示にする方法まとめ
PHPのWarningを非表示にする方法はいくつかあります。
Warningだけを報告対象から除外したい場合は、次のように指定できます。
error_reporting(E_ALL & ~E_WARNING);
PHPのエラーを画面に表示したくない場合は、次の設定を使用します。
ini_set('display_errors', '0');
本番環境では、次の設定が基本となります。
error_reporting = E_ALL
display_errors = Off
log_errors = On
特定の式から発生するエラーを抑制したい場合は、@演算子も利用できます。
$result = @some_function();
ただし、@の多用は問題の発見を難しくするため注意が必要です。
PHPのWarning対策で最も重要なのは、Warningを単純に消すことではありません。
開発環境ではWarningを確認して原因を修正し、本番環境ではユーザーには表示せず、ログに記録する運用が適切です。
特に本番環境では、
error_reporting = E_ALL
display_errors = Off
log_errors = On
という設定を基本にすると、セキュリティを保ちながら、障害発生時の原因調査もしやすくなります。
以上、PHPのWarningを非表示にする方法についてでした。
最後までお読みいただき、ありがとうございました。










