PHPのページが真っ白になる時の対処

MTQに、「ブログ記事のページに何も表示されなくなった」という質問が上がっていました。
その後、「XML宣言を削除すれば良いのでは」という解答があり、その対処で表示されるようになったとのことです。

この件は、PHPでエラーが発生した時に、何も出力しない設定になっていたことが主な原因です。
この件について、より掘り下げて解説します。

1.PHPのエラーを表示する

PHPのページでは、PHPの実行の際にエラーが発生した時には、エラーメッセージを表示することができます。
ただ、公開しているWebページで、PHPのエラーメッセージが表示されるのは、セキュリティ的に好ましくありません。

そのため、エラーがあってもエラーメッセージを表示しない設定にすることができます。
この場合、エラーがあるページにアクセスすると、何も出力されない(真っ白になる)という結果になります。

エラーメッセージを表示するかどうかは、PHPの設定ファイル(php.ini)の「display_errors」の行で指定します。
「display_errors=On」にすると、エラーメッセージが表示されます。
一方、「display_errors=Off」にすると、エラーメッセージは表示されません。

2.「<?」~「?>」をPHPとみなす

PHPのプログラムは、「<?php」と「?>」で囲むことが多いです。
ただ、HTMLとPHPの切り替えを頻繁に行うようなコードでは、いちいち「<?php」と書くのはやや面倒です。

そこで、PHPのコードの開始タグを、「<?php」から「<?」に変えることもできます。
この設定は、PHPの設定ファイルの「short_open_tag」の行で行います。
「short_open_tag=On」にすると、PHPの開始タグを「<?」と書くことができます。
一方、「short_open_tag=Off」にすると、開始タグを「<?php」と書かなければなりません。

3.XML宣言を削除するとページが表示された理由

XML宣言を削除するとページが表示されるようになったのは、上記の2つの設定の影響です。

「short_open_tag=On」になっていると、「<?」はPHPの開始タグとみなされます。
一方、XML宣言は「<?xml version="バージョン番号" encoding="文字コード"?>」のように書き、開始タグに「<?」が含まれます。
そのため、PHPのページの中にXML宣言があると、XML宣言をPHPと解釈しようとしてしまい、エラーが発生します。
ところが、「display_errors=Off」になっていると、エラーメッセージは表示されません。
この2つが重なって、「XML宣言を入れるとページが表示されなくなる」という現象が起こります。

PHPの設定を変えずにこの問題を回避するには、XML宣言をPHPで出力すれば良いです。
具体的には、XML宣言の行を以下のように書き換えます。

<?php echo('<?xml version="バージョン番号" encoding="文字コード"?>'); ?>

4. .htaccessでPHPの設定を変える

Webサーバー(Apache)の設定によっては、.htaccessでPHPの設定を変えることができる場合があります。
その場合、.htaccessでdisplay_errorsの設定を変えて、特定のディレクトリやファイルでだけ、PHPのエラーメッセージを出力するようにすることができます。
また、short_open_tagの設定を変えて、short_open_tagをオン(またはオフ)にすることもできます。

例えば、あるディレクトリのPHPのページでエラーが発生して、表示が真っ白になったとします。
この場合、そのディレクトリに以下の内容の.htaccessファイルを置き、PHPのエラーメッセージを表示して、原因を探るようにします。
そして、エラーの対策が終わったら、.htaccessファイルから以下の行を削除します。

php_flag display_errors On

また、あるディレクトリでは、short_open_tagをオフにしたいとします。
その場合、そのディレクトリに以下の内容の.htaccessファイルを置きます。

php_flag short_open_tag Off