PHPの設定値(ディレクディブ)の優先順位。最終的に反映されるのはどのファイル?

2023-10-28

phpの設定値(ディレクティブ)の優先順位_eyecatch

PHPの設定を変更するのに「php.ini」を使うことが多いと思いますが、php.ini以外にも「.user.ini」や「.htaccess」を使っても変更することができます。

これらのPHP設定ファイルの優先順位が気になったので、調べました。

設定値(ディレクティブ)を変更したのに反映されない??という時は、当記事を参考に優先順位が負けていないかチェックしていただければと思います。

実は「php.ini」の優先順位は最弱で、後から上書きすることができます。

PHPの設定ファイルの優先順位

PHPの設定値、例えばmemory_limitなどは後から変更することができ、基本的には「php.ini」を編集して変更しますが、PHPの設定値は以下のような方法でも書き換えることができます。

  • 「.user.ini」を使う
  • 「httpd.conf」を使う
  • 「.htaccess」を使う
  • PHPのini_set()関数を使う

ここで気になるのが、最終的にどのファイルで設定した設定値が使用されるのか...?というところです。特にphp.iniに書いた設定値が反映されない時はこれらの優先順位の確認が原因特定につながったりもします。

そこで今回、本番環境のサーバーとローカル環境のサーバーを使って、実際にPHPの設定ファイルの優先順位を調べました。

先に結果から書いておくと、PHPの設定ファイルの優先順位は以下の通りでした。

PHPの設定ファイルの優先順位

php.ini ≦ .user.ini < httpd.conf < フォルダ内の.htaccess < 上層フォルダの.htaccess < ini_set()関数

PHPの設定値(ディレクティブ)は左から順番に読み込まれていきます。
(右のものに上書きされます。右側のファイル・関数の設定値が優先される)

更に分かりやすいようにディレクトリーツリーにすると以下のような感じです。

phpの設定値(ディレクティブ)の優先順位_000

PHP設定ファイルの優先順位(イメージ)

  1. 実行するphpファイル内のini_set()関数
  2. 上層ディレクトリにある.htaccess
  3. 同階層にある.htacess
  4. httpd.conf(Apacheの設定ファイル)
  5. .user.ini
  6. php.ini

よく使うであろう「php.ini」または「.user.ini」の優先順位は最弱です。
つまりサーバーの設定ファイル(httpd.conf)で決められた設定値を「php.ini」や「.user.ini」で上書きして設定しなおすのは不可能という事です。

では優先順位を詳しく見ていきましょう・w・

php.iniの設定はMaster Value

上記で述べた通り、php.iniに書いた設定値の優先度は一番低く、同じ設定値を書いたファイルや関数が後から登場すれば上書きされます。

phpinfoを使って確認すると、設定値(ディレクティブ)の種類には、

  • Local Value
  • Master Value

の2つがありますが、php.iniに書いた内容はPHPの起動時に「Master Value」として読み込まれます。そして実際に使用される値が「Local Value」の方です。

phpの設定値(ディレクティブ)の優先順位_001

実際に使用されるのは「Local Value」の設定値

今回はmemory_limitの値を各ファイルで変更することで、最終的にどのファイルのmemory_limitが適用されるかを確認し、ファイルの優先順位を調べました。

スポンサーリンク

「php.ini」および「.user.ini」の優先順位

PHPの設定を変更するには「php.ini」か「.user.ini」を使うことが圧倒的に多いと思いますが、このファイルの優先順位は一番低いです。

つまり「httpd.conf」や「.htaccess」に同じ設定値があるとそちらに負けます。
とはいえ、共有サーバーの場合はサーバーの設定ファイルには余計な記述はないので、php.iniを使えば大体の値はそのまま反映されるはずです。

また「php.ini」と「.user.ini」のどちらが優先されるのか?を調べてみたのですが、これはサーバーの環境によって変わるようです。

一応php.iniの方が設定できるディレクティブの項目が多いのと、php.iniは.user.iniによって上書きされることから、順序を付けるなら、

php.ini < .user.ini < httpd.conf

という感じになります。また、コードは後から書いた値が反映されるようで、

 php.ini
memory_limit = 512M
memory_limit = 128M

のように書いている場合は「128M」が反映されました。

参考:php.iniと.user.iniの影響範囲

色々なサーバー会社を調べたところ、php.iniや.user.iniを複数のディレクトリに設置した場合、そのディレクトリ内のファイルが優先されるか?ホームディレクトリ内のファイルが優先されるか?はサーバー会社によって異なるようです。

また、設置ディレクトリの下にある下層ディレクトリに影響するかどうか?についてもサーバー会社によって異なる模様です。

詳しくはサーバー会社の案内に案内が無いか確認するか、効く方にコードを追記するしかなさそうです...ややこしいね。

「httpd.conf」の優先順位

サーバープログラムである、Apacheの設定ファイルの「httpd.conf」を使う事でもPHPの設定値を変更することができます。この場合php.iniと記述方法が異なり、

php_value memory_limit 128M

のように書くことでphpのmemory_limitの値が変更できます。

phpの設定値(ディレクティブ)の優先順位_002

xamppでhttpd.confを編集してテスト

本番環境の共有サーバーでは「httpd.conf」の編集は不可能なので、今回はローカル環境で試しました。結果順位は以下の通りです。

php.ini(.user.ini) < httpd.conf < .htaccess

一応「httpd.conf」の優先度は「php.ini」や「.user.ini」よりも高いですが、PHPの値を「httpd.conf」で決めることはごく稀なので、実際はphp.iniの値がそのまま反映されることでしょう。

「.htaccess」の優先順位

「.htaccess」はサーバー上に配置できる設定ファイルです。リダイレクトの設定にも使ったりします。「.htaccess」も先ほどの「httpd.conf」同様の記述、

php_value memory_limit 128M

という風に書くことでPHPの設定値を変更することができます。

「.htaccess」のPHP設定値の優先順位を調べると以下の通りになりました。

php.ini(.user.ini) < httpd.conf < .htaccess < 上層の.htaccess

「.htaccess」に関しては上層のディレクトリにある「.htaccess」の値が優先されました。(※言い換えれば「.htaccess」は下層ディレクトリにも影響する。)

とはいえ、httpd.confと同じように.htaccessにPHPの設定値を書くことも稀なので、基本的にはphp.iniや.user.iniの値が反映されます。

PHPのini_set()関数の優先順位

最後にPHPのini_set()関数についてです。
PHPの設定値を反映する方法としては最強の優先度を誇ります。(言い方変)

今まで紹介してきた「php.ini」や「.htaccess」といった全てのファイルに“memory_limitを128MBにする設定”を書き込んでいても、phpファイル内にini_set('memory_limit', '256M');の記述があればこの値が使われます。

<?php
ini_set('memory_limit', '1G');
phpinfo();
?>

例えば上記のように、phpinfo();の実行前にini_set()を使ってやると...

phpの設定値(ディレクティブ)の優先順位_003

こんな感じにPHPの値が変更されます。
とはいえini_set()をPHPの設定値変更のために使用することはほぼ無いと思います。
つまり、結局は優先順位が一番下の「php.ini」か「.user.ini」が使われます。

結局サーバーでは「php.ini」の値が使われる

ここまで色々なファイルでphpの設定値(ディレクティブ)を変更する方法、およびその優先順位を調べてきましたが、ほとんどのサーバーで実際に使用される値は「php.ini」か「.user.ini」の設定値になるはずです。

優先度自体は「httpd.conf」や「.htaccess」、ini_set()関数の方が高いのは事実ですが、これらを使ってPHPの細かいを行うのはかなりレアケースなので...。

レンタルサーバーの場合は、これらのファイルにはPHPの細かい設定値に関する内容は書かれていないので、実質「php.ini」でPHPの設定値を変更できるという訳です。

memory_limitなどの主要項目に関しては記述されており、php.iniでサーバー設定値の上限以上に設定することは出来ないというのも事実ですが...。
ini_set()関数に関しても、共有サーバーでは規制されていることでしょう。

php.iniは設定できる項目数が多い

最後になりましたが、PHPの起動時に読み込まれる「php.ini」は一番最初に読み込まれる設定ファイルなので、設定できる項目が.user.iniよりも多くなっています。

PHPに設定できる設定値(ディレクティブ)はPHPの公式ページに一覧があります。

外部リンク

【PHP公式】PHPディレクティブの参考先
PHP: List of php.ini directives - Manual

phpの設定値(ディレクティブ)の優先順位_004

PHP_INI_SYSTEMの設定値はphp.iniのみで設定できる

ここの一覧で「PHP_INI_SYSTEM」のラベルが付いたディレクティブは.user.iniでは設定できません。PHPの設定値は優先順位だけでなく、指定できる・できないがある点にも注意したいところです。ラベルは4種類あり、以下の通りです。

ラベル(モード) 説明
PHP_INI_ALL いずれのファイルや関数でも設定可能
PHP_INI_SYSTEM php.iniまたはhttpd.confで設定可能
PHP_INI_PERDIR php.ini、.htaccess、httpd.conf、.user.iniで設定可能
PHP_INI_USER ini_set()や.user.iniで設定可能

そんなこんなで結局一番使うのは「php.ini」でした。



まとめ

以上、PHPの設定ファイルの読み込み優先度についてでした。
優先順位だけをみると一応「php.ini」や「.user.ini」よりも「httpd.conf」や「.htaccess」の方が優先度は高く、こちらに同じコードがあれば上書きされます。

優先順位が最強なのはプログラムファイルにini_set()関数を直書きでしたが、上層のディレクトリにある.htaccessが結構優先度高めなのには驚きました。

が、そんなところでPHPの設定値を設定しているのはごく稀なので、基本的には「php.ini」を編集すればその値が反映されることでしょう。

ルート権限がない共有サーバーでは「php.ini」か「.user.ini」までしか触れませんが、サーバーの設定ファイル等でPHPの設定値(ディレクティブ)が設定されている場合は上書きする術はないので諦めましょう!

この記事が誰かの何かの役に立てば幸いです。
ではではこのへんで・w・

-サイト構築
-

site-logo
ありがとうございました!
良かったらシェアしてネ・w・
当サイトはピンバックを受け付けます。

© 2023 ソロ学