Mac環境のphp.iniのデフォルトパスは「/usr/local/php/php.ini」のはずが、バンドルPHPは「/etc/php.ini」を参照している訳
PHPをインストールしApacheにモジュールロードの指定を行い、
魔法の呪文「phpinfo()」でPHPの現在設定を確認すると、
「PHPソースのビルド・インストール情報に書かれている内容」とは、
実際には異なった設定で実装されていることが分かりました。
さて、自分が利用しているPHPがデフォルトでどのディレクトリにある
「php.ini」を参照しているのか?なぜそのディレクトリを参照しているのか?
その仕組みについてご紹介します。
概要
Mac環境のphp.iniのデフォルトパスは「/usr/local/php/php.ini」のはずが、バンドルPHPは「/etc/php.ini」を参照している訳
タイトルが長くてすみません。
そのまんまなのですが、
ここで言う「Mac環境のphp.iniのデフォルトパス」と言っているのは、
PHPを「v5.5.38|PHP: Downloads」からダウンロードしたソースファイルの、
インストール情報に書かれている内容です。
5.
php.ini
の場所を設定するか、デフォルト値を使用します。(デフォルトを使用する典型的なデフォルト値)Mac OS X上の場所は/usr/local/php/php.ini
であり、phpinfo()
はこの情報を表示します。 php.iniが使用されていない場合、PHPはすべてのデフォルト値を使用します。関連するFAQも参照してください。php.ini
を見つける。(以下のGoogle翻訳)
5. Set the
php.ini
location or use the default A typical default location on Mac OS X is/usr/local/php/php.ini
and a call tophpinfo()
will reveal this information. If aphp.ini
is not used,PHP will use all default values. See also the related FAQ on findingphp.ini
.
上記の記述はPHPのWebサイトでも書かれています。
php.ini
の場所を設定するか、デフォルトを使用します。 Mac OS X におけるデフォルトの場所は/usr/local/php/php.ini
で、 phpinfo() をコールするとこの情報を表示します。php.ini
を使用しない場合は、PHP はすべてデフォルト値を使用します。 php.ini ファイルはどこにおけばいいのですか? が、関連する FAQ です。
MacOSXでバンドルされているPHPのデフォルトパス(php.ini)
いや、このパスが違っていたからどうだという事はないのですが、
「典型的なデフォルト設定」が「/usr/local/php/php.ini」になっているんだろうと思って、
確認せずに「php.ini」をMacOSXに設定しても有効にならない・・・と、
困惑してしまうことになるかなと思いまして。(自分が困惑したという事です)
上記のリンク先には以下のように書かれています。
Unix/Windows: php.ini ファイルはどこに置けばよいのですか?
UNIX の場合、デフォルトでは
/usr/local/lib
です。コンパイル時に –with-config-file-path オプションを使用してこの場所を変えたいという人も多いでしょう。 例えばこのようにすることも出来ます:
--with-config-file-path=/etc
そしてディストリビューションの
php.ini-development
を/etc/php.ini
にコピーし、環境に合うように 編集してください。
--with-config-file-scan-dir=PATH
上記の記述がまさにそれです。
MacOSX標準でバンドルされているPHPは、--with-config-file-path=/etc
によって、
「php.ini」の標準ディレクトリパスが「/etc
」へと変更されているのです。
コンパイルされた時点で。
※厳密にはMacOSX10.7(Lion)環境においては、
「/etc」は「/private/etc」へのシンボリックリンクが貼られ「/private/etc/php.ini」を参照しています。
「php.ini」の設定可能なディレクトリと読み込み順序
またphp.iniが適用される場所とその順序については以下に書かれています。
設定ファイル (php.ini) は PHP の起動時に読み込まれます。 PHP のサーバーモジュール版では、Web サーバーの起動時に 一度だけ読み込まれます。CGI 版と CLI 版では、スクリプトが呼び出される度に読み込まれます。
読み込む php.ini は、これらの場所を順に探します。
- SAPI モジュール特有の場所 (Apache 2 における PHPIniDir ディレクティブ、 CGI/CLI 版における -c コマンドラインオプション、 NSAPI における php_ini パラメータ、 THTTPD における PHP_INI_PATH 環境変数)
- PHPRC 環境変数。PHP 5.2.0 より前では、 これは、次に挙げるレジストリキーの後にチェックされていました。
- PHP 5.2.0 以降では、PHP のバージョンごとに別の場所の php.ini を使用することができます。以下のレジストリキーを順に調べて使用します。 [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z]、[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y] および [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x]。 x、y および z はそれぞれ PHP のメジャーバージョン、マイナーバージョン、 リリース番号を表します。これらのキーに IniFilePath の値が設定されていれば、最初に見つかった場所の php.ini を使用します (Windows のみ)。
- [HKEY_LOCAL_MACHINE\SOFTWARE\PHP] にある IniFilePath の値 (Windows のみ)。
現在の作業ディレクトリ (CLI を除く)
- Web サーバーのディレクトリ (SAPI モジュールの場合)、 もしくは PHP ディレクトリ (そうでない Windows の場合)
- Windows ディレクトリ (C:\windows もしくは C:\winnt)) (Windows の場合) 、もしくはコンパイル時のオプション –with-config-file-path
上記の各設定を順に探しますとなっています。
「SAPI モジュール」 という表現はApacheでモジュールを読み込んで、
「Apache Handler」として動作させるという事ですので、
一般的に利用されているPHPの利用パターンの事です。
※PHPのCGI実行としてApacheを設定している場合は異なります。
上記から見ていくと、
- Apache 2 における PHPIniDir ディレクティブ(httpd.confで指定)
- 現在の作業ディレクトリ(URLのカレントディレクトリ上)
- Web サーバーのディレクトリ(ドメインのルートディレクトリ上)
- コンパイル時のオプション –with-config-file-path(デフォルトパス)
の順で探し、読み込まれると書かれています。
普段意識しているのは、1~3なのではないでしょうか。
PHPIniDirでphp.iniを指定する。(→1の設定:サイト全体に有効)
個別に変更する場合、
ドキュメントルート(→3の設定)や、
URL(→2の設定)の現在ディレクトリに別途php.iniを配置する。
これで、全体の設定を、URLで個別に上書きが可能。
と。
しかしまだ最後の「設定4」が残っています。
結果として、同じ属性値が「php.ini」にそれぞれ別の値で設定されている場合、
Webサーバー上の公開ディレクトリなどに設定した「php.ini」の値が、
「–with-config-file-path(デフォルトパス)」で指定した値で上書きされるという事です。
※個別に設定した値が有効にならない。
これって、地味にハマるポイントかなと思ったりします。
普段はあまり意識せず、Webサーバーの公開ディレクトリ直下に、
php.iniを配置して運用することが多いレンタルサーバーでは、
「変更してならない値」のみがデフォルトパスに指定されているのでしょう。
自宅サーバーの場合、こうしたデフォルトパスも意識して、
構築する必要があるという事です。
PHPが参照するデフォルト「php.ini」ディレクトリを調べる
さて「MacOSX10.7(Lion)」の環境などと言っても、
大半の人には役に立たないわけなので、ご自分でご確認して頂く方がいいでしょう。
以下に、確認の手順をご紹介します。
OSXバンドルPHPデフォルト「php.ini」は同値(オプション)でコンパイル
結果として、MacOSX10.7(Lion)においての、
php(実行ファイル)と、libphp5.so(モジュール:Apache 2.0 Handler)で、
それぞれのコンパイル時に利用されているコンパイルオプションは、
同じ設定でコンパイルされていることが分かります。
同じ結果である為、これだけでは、
「libphp5.so(モジュール:Apache 2.0 Handler)」のコンパイル値を、
「phpinfo()」が出力しているという保証が得られないことから、
別の環境であるMAMP、MacPortによって実装されている、
双方のコンパイルオプションを確認しています。
MacPortのphpとモジュールのコンパイル設定の違い
MacPortではPHP本体のインストールとApacheモジュールのインストールでは、
利用されるコンポーネント名が別になっており、
それぞれを別でインストールすることができます。
双方をインストールして、コンパイル設定の情報を確認します。
以下の通りですが、CLIかApache Handlerとしてコンパイルするかを指示する
コンパイルオプション以外はほぼ同一の設定でコンパイルされています。
MAMPのphpとモジュールのコンパイル設定の違い
以下の通り、双方の値には多くの差異が発生していることが分かります。
※双方で違うコンパイルで実装されている。
PHPとlibphpNN.so(Apacheハンドラ)ではコンパイルもデフォルト設定も異なる(可能性がある)
※libphpNN.so:NNはバージョン値。
(当然ではありますが)
「php(実行ファイル)」のコンパイルオプションと、
「libphpNN.so(Apacheハンドラ)」のコンパイルオプションは、
同じ設定値を利用してコンパイルする(CLI,ApacheHandlerの指定は除外)ことも出来ますし、
必要に応じて異なるオプションを選択してコンパイルすることもできます。
むしろ、目的が違う為、別設定でコンパイルされることの方が多いでしょう。
結果としてphp実行ファイルで確認できる「-ini」によって、
表示される情報はApacheモジュール実行では利用されず、
サーバモジュールとして利用する場合は、
httpd.confで指定されているモジュールがコンパイルされた際の
コンパイルオプションで指定された値が採用されることが分かります。
モジュール実行されている場合は、
phpinfo()が返してくるコンパイルオプションを採用し確認するといいでしょう。
CGI実行などでは「phpcgi -ini」などで確認するといいでしょう。
※HTML出力が行われ見にくいですが。
当サイト内のコンテンツおよび画像を含むすべてにおいて、管理人アルゴリズンが著作権を保持しております。
当サイトでご紹介しております写真等につきましては著作権の放棄はしませんが、
ライセンスフリーでご利用いただいて構いません。
コンテンツを有益であると感じていただけましたら非常に光栄です。
ありがとうございます。
サイト内コンテンツを引用される際には、出典元として当サイト(個別記事)へのリンクをお願いいたします。
申し訳ございませんが、無断転載、複製をお断りさせて頂いております。
公開日: