質問: 開発を行っているwindows機で php5.6と php7.2 を一つのapacheで動かそうと目論んでいます。 どっちもモジュール版のPHPです。 httpd.confをいじくって http://localhost7で呼び出したときは php7.2 それ以外のホスト名(http://localhost等)で呼び出したときは php5.6で動かす というのが目標で、PHPのバージョンを分けるところまではできました。 (phpinfo()で確認した) --- 本題はここからです。 phpの使い分けはできるようになったのですが php.iniをそれぞれ別のものを読ませたいのにうまくいきません。 http://php.net/manual/ja/configuration.file.php php.iniのパスなどについては↑を見ました。 ・httpd.confのPHPINIDirは削除する ここに書いた指定が一番強く、5と7両方に適用されると思われるため ・レジストリに手を加える HKEY_LOCAL_MACHINE\SOFTWARE\PHP\5.6 というキーを作成し文字列 IniFilePath に c:/xampp/php56 といれる HKEY_LOCAL_MACHINE\SOFTWARE\PHP\7.2 というキーを作成し文字列 IniFilePath に c:/xampp/php72 といれる php.iniに対する設定としてはこのような事おこないApacheの再起動をしました。 でも、 phpinfo()の結果は 5も7も Configuration File (php.ini) Path C:\Windows Loaded Configuration File (none) となります。 この結果の Configuration File (php.ini) Path を見る限りだと レジストリキーの設定方法について勘違いをしているような気がしますが 値をディレクトリではなく直接php.iniファイルにしてみたり HKEY_LOCAL_MACHINE\SOFTWARE\PHP\7.2に直接パスを入れてみたりしましたが Configuration File (php.ini) Path C:\Windows Loaded Configuration File (none) のままです。 また、httpd.confのPHPINIDirに c:/xampp/php といれてみたところ Configuration File (php.ini) Path C:\Windows Loaded Configuration File c:/xampp/php/php.ini となりました。 これも少し違和感があって php.iniは意図したものを読めているものの Configuration File (php.ini) Pathが示す結果は意図しないものではないかと思います。 --- 少し質問点がぼやけてしまいましたが ・まず、レジストリキーの設定でバージョンごとにphp.iniを分けたい ・Configuration File (php.ini) Pathの値が変わらないのはなぜか この2点について教えていただければと思います。 ※・Configuration File (php.ini) Path についてはコンパイル時に決定された値が表示されるので、あとからの設定などが表示されることはないとの回答をいただきました。ありがとうございます。 よろしくお願いいたします。
回答: レジストリで php.ini の場所を指定する際には、 ・HKEY_LOCAL_MACHINE\Software\PHP\5.6 というレジストリキーの下に IniFilePath というエントリを作り、その値に php.ini をフルパスで指定します。つまり **最後の php.ini まで** を指定する必要があります。 `c:/xampp/php56/php.ini` のように。 Configuration File Path の値は、PHP 自体のコンパイル時のオプション(--with-config-file-path)で決定されるものですので、変化しません。 これはつまり、いろんな場所で見つからなかった場合の、最後の最後に見るべき場所として設定されているものです。 ※※※※※ 64bitOS 上で 32bit の PHP を動かしている場合は、レジストリの場所が異なります。 (日本語訳のマニュアルではその部分が欠落している) > > As of PHP 5.2.0, the location of the php.ini file can be set for different versions of PHP. The root of the registry keys depends on 32- or 64-bitness of the installed OS and PHP. For 32-bit PHP on a 32-bit OS or a 64-bit PHP on a 64-bit OS use [(HKEY_LOCAL_MACHINE\SOFTWARE\PHP] for 32-bit version of PHP on a 64-bit OS use [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\PHP]] instead. For same bitness installation the following registry keys are examined in order: [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z], [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y] and [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x], where x, y and z mean the PHP major, minor and release versions. For 32 bit versions of PHP on a 64 bit OS the following registry keys are examined in order: [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y.z], [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x.y] and [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6421Node\PHP\x], where x, y and z mean the PHP major, minor and release versions. If there is a value for IniFilePath in any of these keys, the first one found will be used as the location of the php.ini (Windows only). > > > しかも order の example ではパスが間違ってる(汗) 実際に試したところ、 HKLM\SOFTWARE\WOW6432Node\PHP\5.6 の IniFilePath に、**php.ini のあるディレクトリのフルパス**を記述すると、うまく動いてくれました。