さくらインターネットにて「display_errors」は「On」にしたがエラー表示ができなかった問題が解決できた

私は自分のサイトに「さくらインターネット」の「スタンダード」を利用させていただいています。

そこで「display_errors」を「On」にしてもphpのエラーメッセージが表示できず、少しハマることがありました。さくらインターネットさんに問題があるわけではなく、自分のソースで記述が足らないことが原因でした。それが漸く解決ができたので、まとめておきます。

まず、「display_errors = Onの設定方法」について書きましたが、ここは分かっているという方は「こちらから本題へ」進んでください。

display_errors = Onの設定方法

さくらインターネットさんの公式サイト内では設定方法を見つけられませんでした。「php.iniの項目の詳細」についてはサポートの対象外のようですので無いのだと思われます。ですので、私が調べて設定できた方法を説明します。

現状確認

<?php phpinfo(); ?>

まず、使用しているphpの情報を「phpinfo」にて確認します。
「display_errors」の「Local Value」の値は「Off」、「Master Value」の値は「Off」でした。

「Local Value」と「Master Value」の違い

ここで、「Local Value」と「Master Value」の違いについて簡単に説明しておきます。

「Master Value」はphp.iniの設定された値(初期値というイメージ)、「Local Value」がhttpd.conf.htaccessphpの関数等で設定された値(上書いた値というイメージ)になります。※本当に詳しい内容は私もあまり把握はしていません

優先順位としては「Master Value」<「Local Value」となりますので、確認すべきは「Local Value」です。

php.iniにて設定(設定が効きませんでした)

『さくらインターネット』では、「コントロールパネル」>「アプリケーションの設定」>「PHP設定の編集」にてphp.iniの編集が行えます。
「さくらのサポート情報」様の該当ページへのリンク

こちらで「display_errors = On」を設定します。

設定後phpの情報を確認しましたが、「display_errors」は「Local Value」「Master Value」とも値は「Off」でした。サーバ上の実際に編集された「php.ini」を確認しましたが、値は正しく設定されていました。おそらくですが、該当の「php.ini」が参照されていないように思います。何か設定が必要な箇所を見逃しているのだと思います。

もし何か心当たりがある方がいらっしゃいましたら、ご教示いただけますと幸いです。

.htaccessにて設定(設定不可)

※後程のphpの関数での設定で簡単に行えますので、詳しくは調べていません

こちらは私が利用させていただいているレンタルサーバ「スタンダード」では設定不可です。

php_flag display_errors On

「.htaccess」に上のように記述すると設定できるのですが、下記「さくらのサポート情報」様のページにありますように、「PHP_Flag」が入っていると500エラーとなります。
「さくらのサポート情報」様の該当ページへのリンク

httpd.confにて設定(設定不可)

※後程のphpの関数での設定で簡単に行えますので、詳しくは調べていません

こちらは私が利用させていただいているレンタルサーバ「スタンダード」では設定不可です。

phpの関数「ini_set」にて設定

この設定で「display_errors 」の「Local Value」を「On」にすることができました。ちなみに「Master Value」は「Off」です。

<?php ini_set( 'display_errors', 1 ); ?>

設定は簡単です。エラー表示したいphpファイルに上を記述します。
※htmlでもphpを利用できる場合はhtmlファイルも可

注意点

「ini_set( ‘display_errors’, 1 )」が記述された以降のエラーが表示されますので、チェックしたい箇所より前に記述しましょう。単純にphpファイルの最初の方に記述してしまえばOKです。

WordPressであれば、「header.php」等に記述すると全ページに適応されます。サイトの公開時にはこの部分をコメントアウトにしておくと、問題が起きたときに調査しやすいかと思います。

本題:「display_errors」は「On」にしたがエラー表示ができなかった

上記「phpの関数「ini_set」にて設定」でエラー表示を「On」にできましたが、なぜかエラーが表示されません。

<?php $arr["number"]; ?>

エラーを意図的に出すために「$arr[“number”];」のみ記述しました。エラーを出すためですので、他の処理は何もありません。未定義のもの(配列の値)を参照させて、「定義されていない変数です(Undefined variable)」というエラーを期待していました。

エラーが表示されない原因は?

「error_reporting()」を確認・設定することで判明しました。error_reporting()で「エラー種類」を確認してみると「E_RECOVERABLE_ERROR」に近い値が設定されていました。「E_RECOVERABLE_ERROR」というエラー種類は「致命的なエラーを表示させるもの」なので、表示させるエラーの対象はかなり狭いと思われます。よって、私が期待していたエラーは表示されていなかったようです。厳密には違う可能性が高いように思いますが、error_reportingによって、違うエラー種類を試してみようと推測できました。曖昧な内容ですみません。

error_reporting(E_ALL);

↑このように設定を行うことで漸くエラーが表示されるようになりました。「E_ALL」はサポートされるすべてのエラー・警告を表示する設定です。本公開前のデバッグ用であれば、特に問題ないように思いますが、もう少し「エラー種類」の選定は精査した方が良さそうです。

余談:E_RECOVERABLE_ERRORやE_ALLについて

注釈

この部分の内容は私がこうかな?と思った内容を書いています。厳密な内容は、もう少し複雑なのかなと思います。ご了承ください。
ただ、下記のような感じで単純に考えることで、イメージしやすいかなと思います。今回はそのお蔭で、解決のために試せることが増え、解決に至りました。よって、余談として掲載させていただきました。話半分で見ていただければと思います。

「E_ALL」や「E_RECOVERABLE_ERROR」とは数値を分かりやすくするために、用意された定数(名前)です。実際は、「E_ALL」が『32767』、「E_RECOVERABLE_ERROR」が『4096』という数値です。この数値は10進数ですがこれを2進数で見ると意味が分かるような気がしてきます。

32767(10進数)=111111111111111(2進数)、4096(10進数)=1000000000000(2進数)。「1」の部分がエラー表示する箇所と考えられます。「E_ALL」の方はすべて表示となっており、「E_RECOVERABLE_ERROR」は1つのみ「1」です。

実際は、「4177」でしたので、「1000001010001」となります。「E_RECOVERABLE_ERROR」と比べると「1」が多いですが、「E_ALL」と比べると格段に少ないです。

よって、恥ずかしながら、「エラー表示が少ない」を「エラーが表示されない」と私は錯覚していたわけです。それが原因で少しハマってしまいました。他のサーバを触る際には気を付けようと思います。