PHPで開発中に最も困るのがエラーがまったく表示されない状況です。画面が真っ白(WSOD:White Screen of Death)になったり、何が問題か分からず手が止まってしまったり。この記事ではPHPのエラー表示がされない原因を網羅的に特定し、それぞれの解決方法を紹介します。WordPressサイトでの設定も含めて、実際に手を動かして直せるよう丁寧に解説しますので、原因不明のエラーにお困りの方はぜひ読み進めてください。
目次
PHP エラー表示 されない状態が起きる理由
PHPでエラーが画面に表示されない典型的な理由はいくつかあります。開発環境と本番環境での設定差異、PHP設定ファイル(php.ini)、WordPress固有の設定、サーバーの挙動などが絡むことが多いです。本節ではエラーが表示されない原因をロジカルに切り分けます。
display_errors が Off になっている
PHP の設定でエラーを画面表示するかどうかを制御するディレクティブ display_errors が Off だと、画面上にエラーが一切表示されません。たとえ error_reporting がすべてのエラーを検出するよう設定されていても、display_errors が無効であればエラー画面は出ません。特に本番環境用の php.ini ではこの設定が Off になっていることが多いです。
error_reporting のレベルが低い/除外設定されている
error_reporting が E_ALL でない、あるいは E_NOTICE・E_WARNING といったエラーレベルが除外されていると、漏れてしまうエラーがあります。例えば E_ALL & ~E_NOTICE のように通知系エラーを除外すると、軽微なエラーが見えずに「何も起きていないように見える」状況になります。
syntax error(構文エラー)で ini_set や設定反映前に実行が止まっている
PHP スクリプトに構文エラーがあると、ファイルが正しく読み込まれず ini_set や error_reporting の設定が実行される前にエラーでプロセスが停止します。このため、表示設定がどうあれ画面が真っ白になることがあります。構文チェックツールなどで早期発見が重要です。
サーバーやホスティングの設定で上書きされている
Apache の .htaccess、nginx や PHP-FPM の FastCGI 設定、.user.ini ファイルなど、様々なレベルで display_errors や error_reporting が上書きされていることがあります。またホスティング会社によっては、安全性のために ini_set を制限していたり、これらの設定をユーザーが変更できないようにしている場合があります。
WordPress のデバッグ設定が抑制されている
WordPress には WP_DEBUG、WP_DEBUG_DISPLAY、WP_DEBUG_LOG といった定数でエラー表示を制御する組込の仕組みがあります。デフォルトでは WP_DEBUG が false に設定され、エラーを表示しないようになっていることが多いため、本番環境ではこれが原因となります。
PHP エラー表示 されない状態を確認する手順
まずはエラー表示がされない原因を一つひとつ確認し、どこで設定が阻害されているかを把握することが解決への近道です。以下の手順で確かめましょう。
phpinfo() を使って現在の設定を確認する
スクリプト内最初に phpinfo(); を呼び出し、ブラウザで表示される内容から display_errors、error_reporting、display_startup_errors の値を見ます。これで実際にどの設定が反映されているかが分かります。設定変更後はウェブサーバーの再起動やキャッシュクリアも忘れずに行ってください。
構文エラーがないかチェックする
コマンドラインで php -l ファイル名 を実行して構文チェックを行ってください。構文エラーがあると、スクリプトは最初から実行できず設定変更が反映されません。特にセミコロンの欠落やクォート未閉じなどが原因となります。
.htaccess や .user.ini の設定を調べる
Apache モジュール版 PHP なら .htaccess、FastCGI/FPM や CGI 版なら .user.ini に display_errors や error_reporting の設定が含まれていないか確認してください。これらはディレクトリごとに反映したり遅延キャッシュがあったりするので、設定のタイミングや順序も確認が必要です。
WordPress のデバッグ用定数を確認する
wp-config.php の中で WP_DEBUG、WP_DEBUG_DISPLAY、WP_DEBUG_LOG の定義がどのようになっているか確認しましょう。たとえば本番環境では WP_DEBUG を true にしても WP_DEBUG_DISPLAY が false にされていることがあります。
PHP エラー表示されないときの設定変更と解決策
原因が特定できたら、設定を適切に変更してエラーが表示されるようにしましょう。開発環境と本番環境を区別し、安全かつ効率的に対応するための方法を以下にまとめます。
php.ini の設定を変更する
php.ini を直接編集できる場合は、以下の設定を確認・修正します。display_errors を On、error_reporting を E_ALL に設定することで、ほぼすべてのエラーが表示されるようになります。また display_startup_errors を On にすると起動時のエラーも見えるようになります。
ini_set を使ってコード上で設定する
php.ini を変更できない環境では、スクリプト冒頭に ini_set(‘display_errors’, ‘1’); ini_set(‘display_startup_errors’, ‘1’); error_reporting(E_ALL); といったコードを追加します。これで直後の処理についてはエラー表示が有効になります。ただし構文エラーはこれより先に発生すると表示されません。
.htaccess や .user.ini で設定を上書く
Apache を使っている場合 .htaccess に php_flag display_errors On や html_errors On の記述を追加できます。FastCGI/FPM 環境では .user.ini に display_errors = 1 や error_reporting = E_ALL と書いてディレクトリ伝いに設定を有効化します。これらが反映されるまで数分~数十分のキャッシュ待ちがある場合があります。
WordPress のデバッグ定数を設定する
wp-config.php を編集して以下のように設定します。開発中は WP_DEBUG と WP_DEBUG_DISPLAY を true にすることでエラーを画面上に表示できます。本番対応では WP_DEBUG_DISPLAY を false にし、エラーは WP_DEBUG_LOG でログファイルに記録するようにします。具体的には:
- define(‘WP_DEBUG’, true);
- define(‘WP_DEBUG_LOG’, true);
- define(‘WP_DEBUG_DISPLAY’, true または false);
この設定により、必要なログ取得と画面表示の制御が柔軟になります。
WordPressでエラー表示されないケースに特有の注意点
PHP 単体ではなく WordPress を使っていると、より複雑な原因が絡むことがあります。本節では WordPress 特有の理由と対処方法を紹介します。
プラグインやテーマによる干渉
WordPress のプラグインやテーマがエラー処理を上書きしていたり、エラーハンドラーを独自実装してエラーを画面に出さないようにしている可能性があります。問題を切り分けるため、一度すべてのプラグインを無効化し、デフォルトテーマに切り替えて挙動を確認してみてください。
WP_DEBUG_DISPLAY が false に設定されている
wp-config.php に define(‘WP_DEBUG_DISPLAY’, false); があると、エラーはログにしか出力されず、画面には表示されません。エラーを画面上で確認したい場合はこの値を true にします。ただし本番環境では安全のため false のままにし、ログで確認する運用が望ましいです。
サーバーのエラーログとの重複や非表示
WordPress がログを書いていても、サーバーのエラーログ(例:Apache/nginx の error_log)で別途記録されていたり、そちらが優先されてブラウザ表示されないことがあります。サーバーのログ設定を確認し、ログファイルのパーミッションや所在を把握しておく必要があります。
PHP のバージョンや設定モードによる違い
PHP のバージョン(特に PHP8 系など)や動作モード(CLI、FastCGI、FPM、CGI モジュール等)によって、display_errors や error_reporting の既定値や挙動が変わることがあります。特定モードでは ini_set() が制限されていたりするため、phpinfo() でモードを確認し、それに応じた方法を使うことが重要です。
screenにエラーが表示されないときの特殊ケース
通常の設定でもエラーが表示されない特殊なケースがあります。これらは見逃されがちですが、把握しておくことで原因究明の手助けになります。
致命的エラーや構文エラーで output が全く生成されない
ファイルに誤った構文があると、PHP がそのファイルを一切読めず、出力バッファへのデータも生成されません。この場合、画面は空白で内部的には fatal error が発生しています。php -l コマンドやサーバーのエラーログを確認してください。
ブラウザキャッシュやオブジェクトキャッシュの影響
キャッシュプラグインやサーバー側のキャッシュ(オブジェクトキャッシュや OPcache 等)が古いスクリプトを提供していて、設定変更が反映されていないように見えることがあります。キャッシュをクリアしたり、OPcache をリセットする処理を行ってみてください。
HTTP エラー画面(500 エラーなど)で PHP が内部で例外を投げている
PHP のエラーがサーバーレベルで処理されて、 HTTP 500 エラー表示のみがブラウザに返されることがあります。こういう場合はサーバーログに fatal error の内容が記録されているはずです。ログファイルやホスティングの管理画面で該当する日時のエントリを探しましょう。
設定を変更後に確認すべきこと
設定を変えたら実際にエラーが表示されるかどうかを確認するため、テスト用のエラーを意図的に発生させることが有効です。例えば未定義変数参照や関数呼び出しミスなど簡単なものを使います。また、設定変更後はサーバー再起動・キャッシュクリアを忘れないようにしましょう。
テスト用のエラーを発生させる例
以下のようなコードを新しいファイルに書いてブラウザでアクセスしてみてください。
未定義関数を呼び出したり、文法を間違えた部分を意図的に入れることで、設定が正しく反映されていれば画面にエラーが表示されます。
この方法で画面白紙かログのみかを比較すれば原因が絞りやすくなります。
サーバー再起動とキャッシュのクリア
php.ini を変更したら Web サーバーや PHP-FPM を再起動する必要があります。
また OPcache やホスティングのキャッシュ機構が働いていれば、それらをクリアしないと古い設定がまだ残っているように見えることがあります。
パーミッションとファイル所有者の確認
デバッグログファイルに書き込む際にディスクの書き込み権限や所有者が正しく設定されていないとログが生成されなかったりアクセスできなかったりします。wp-content/debug.log などのディレクトリのパーミッションを確認しましょう。
まとめ
PHPでエラー表示されない原因は、設定ミス、構文エラー、サーバー設定、WordPressデバッグ設定など複数重なっていることが多いです。
php.ini や display_errors・error_reporting の値を確認し、ini_set や .htaccess/.user.ini で上書きされていないか調べましょう。
WordPress を使っている場合は WP_DEBUG や WP_DEBUG_DISPLAY、WP_DEBUG_LOG の定義状況もしっかりチェックしてください。
設定変更後は必ずテストエラーで表示を確認し、キャッシュやサーバー再起動も行うことが肝心です。
これらの手順を実践すれば、PHP エラー表示されない問題はほぼ解決できます。
コメント