phpinfoに表示される「Local Value」と「Master Value」の違いについてです。
PHPの様々な情報を表示する通称:phpinfoページの設定値(ディレクティブ)には「Local Value」と「Master Value」の2種類の値が表示されます。
結局サーバーで使われるのはどちらなのか?長いこと気になっていたのですが、この度両者の違いを色々検証して確認してみました。
ブラウザで最終的に使用されたのは「Local Value」の設定値でした。
この記事の目次
phpinfoのLocal ValueとMaster Valueの違い
PHPのphpinfo()関数を実行すれば、PHPに関する設定を一覧で確認できるphpinfoというページを表示することができますが、このphpinfoにある「Local Value」と「Master Value」の違いについて検証しました。
色々検証した結果については後につらつら書くとして、まずは結論から。
phpinfoの「Local Value」と「Master Value」の違いについては以下の通りです。
- Local Value(ローカル値):php.ini以外で後から上書きされた値
- Master Value(マスター値):php.iniによって読み込まれる値
- 実際にブラウザで使われる値は「Local Value」の設定値
- コマンドライン(Shell)で使われる値は「Master Value」の設定値
「Local Value」はブラウザなどでPHPを実行した際に、実際に使用される値。
「Master Value」はphp.iniで読み込まれた値で、設定値(ディレクティブ)について特に何も書かれていない場合はPHPのデフォルト値が反映されるようです。
多くのサーバーで重要になる値は実際に使われる「Local Value」の方かと思います。
Master Valueとは?
phpinfoの「Master Value」には、php.iniから読み込まれた設定値が表示されます。
マスター値と言われていますが、グローバル値と言い換えると分かりやすいです。
つまり「Master Value」は広域に定義されている初期値のような値です。
こちら、分かりやすいように具体的に検証してみました。
まずサーバーで使用されるphp.ini(場所は後述)に、
php.ini
memory_limit = 100M
と記述してmemory_limitの値を変更してみます。この状態でphpinfoを表示すると...
phpinfoの「Local Value」および「Master Value」の値が100Mになりました。
このように「php.ini」以外の場所に設定値(ディレクティブ)が存在しない場合、Local ValueとMaster Valueには同じ値が使用されます。
また、特に何も書いていない場合はPHPのデフォルト値が使用されます。
Master Valueに使用される「php.ini」の場所
「Master Value」には「php.ini」に書かれている設定値が表示されますが、このphp.iniの読み込み場所はどこか?これはphpinfoページに書いてあります。
phpinfoを表示したら、“Loaded Configuration File”という項目にphp.iniへのパスが表示されているのでこれをチェックしましょう。
この場所にある「php.ini」内の設定がMaster Value値に使用されます。
またphp.ini内に同じ設定値を複数書いている場合は、最後の値が使用されます。
php.ini
memory_limit = 512M
memory_limit = 256M
memory_limit = 100M
例えば上記の記述をした場合は、100MがMaster Valueに表示されます。
Local Valueとは?
phpinfoの「Local Value」には、php.ini以外の場所で設定された(されなおした)値が表示されます。php.ini以外の場所とは、具体的には以下のような方法でphp.iniの設定を上書きした場合です。
- .user.ini
- httpd.conf
- .htaccess
- ini_set()関数
上記の方法は全てphp.iniの値を上書きします。
なのでこれらの方法で設定した値はすべて「Local Value」として表示されます。
後述しますが、実際に使用されるのはこの「Local Value」の値です。
こちらも具体的に検証しました。まず.htaccessに、
.htaccess
php_value memory_limit 256M
というような記述をします。この状態でphpinfoを表示すると...
.htaccessの記述によって「Local Value」の値が128Mから256Mに上書きされました。
(ここで、Master Valueの128MというのはPHPのデフォルト値です。)
この結果「Master Value」にはphp.iniの設定値かPHPのデフォルト値が表示。
「Local Value」にはphp.ini以外で設定した値が表示されることが分かります。
“初期値”なのか“上書き値”なのか?というところに違いがあるようです。
では、最終的に使用されるのはどっちの値なのか?...
最終的に使用されるのは「Local Value」の値
続いて、一番気になっていた「Master Value」と「Local Value」は実際のサーバー環境でどちらが有効なのか?についても検証しました。
検証方法はシンプルに、意図的にメモリ不足エラーを発生させるプログラムを使い、Master ValueとLocal Valueのどちらの値が有効なのかを検証します。
<?php for ($i=0; $i<100000000; $i++) { $a[$i] = $i; } ?>
PHPでは、こんな感じに配列ループを回せばいずれメモリが不足します。
「Master Value」の値を2Mに固定し「Local Value」だけを変更して実行してみます。
Local Valueのmemory_limit:2M
memory_limitを2Mにして、先ほどのプログラムを実行すると...
Fatal error: Allowed memory size of 2097152 bytes exhausted (tried to allocate 2097160 bytes)
というエラーが発生しました。“2.097152 bytes”は約2.1Mです。
Local Valueのmemory_limit:256M
「Local Value」のmemory_limitを256Mに変更し、同じプログラムを実行します。
Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 268435464 bytes)
“268435456 bytes”は約268MBなので、実質「Local Value」の値が使われていそう。
Local Valueのmemory_limit:512M
更にmemory_limitの値を512Mまで増やしてみます。
すると「Local Value」の値が512Mになったことで、今まで発生していたメモリ不足のエラーが発生しなくなりました!
ここでプログラムのループ回数を1桁増やしてみると...
メモリ不足のエラーが発生。やっぱり使われているのは「Local Value」の値!
少なくともブラウザの実行では「Local Value」の値が実際に使われたと言えます。
コマンド環境では「Master Value」の値が出る
Master ValueとLocal Valueで、実際に使われるのは「Local Value(ローカル値)」であることが検証で分かりました。しかしShellでは「Master Value」が使われる様子...
例えば、以下のように
- Local Valueのmemory_limitが256M
- Master Valueのmemory_limitが100M
という環境でphp -r "echo ini_get('memory_limit');"
というコマンドを叩いてみると、100Mと返ってきました。さらにphp -i
コマンドでも100Mになっています。
- echoコマンド実行時
- php -iコマンド実行時
何が言いたいのかというと必ずしも「Local Value」の値が使われるという事ではないという事です。コマンド環境、つまりPHPスクリプトをバックグラウンドで動かしている場合などは「Master Value」の値が使われるのかもしれません...。
ただ、少なくともブラウザが実行したPHPの値は「Local Value」というphp.ini以外のファイルで上書きされた値が使用されました。
ということで、実際にサーバーで使われる(多くの)設定値は「Local Value」という事が分かりました。
まとめ
以上、phpinfoの「Local Value」と「Master Value」についてでした。
長くなったのでもう一度振り返っておくとポイントは以下のような感じ。
- Local Value:php.ini以外で後から上書きされた値
- Master Value:php.iniによって読み込まれる値
また、今回の検証結果を表にすると以下のような感じになりました。
phpの設定値(ディレクティブ)の設定個所 | phpinfoの反映箇所 |
設定値の記述なし | Master Value(PHPのデフォルト値) |
php.ini | Master Value |
.user.ini | Local Value |
httpd.conf | Local Value |
.htaccess | Local Value |
ini_set()関数 | Local Value |
一般的にサーバーでは「Local Value」の値が使われるという認識でOKです。
ただし、一部の環境(コマンド)などでは「Master Value」の値も使われるかも?
共有サーバーなどで初めから設定されている値(php.iniの値)を自分で変更したからって本当に使えてるの...?と疑問に思っていたのですが、やっぱり上書きされた後のLocal Valueの値が使われるんですねぇ~。
これはレンタルサーバーで「memory_limit」を変更するのも効果的と言えそうです。
結構時間食っちゃいましたが、誰かの何かの役に立てば幸いです。
ではではこのへんで・w・