んむぅ…php.iniとの格闘は現在も続いております。
今回の御題は「どこのini読んでるねん?」
特にポイントになったのがコマンドライン関係。…いやまぁ「PHP コマンドラインでなんか使いたくねぇよ」とかいう切実な発言をしたいのですが、現実問題として「テーブルとか全部クラス設計している以上cronで動かすコマンド系を多言語で」ってのは…無理じゃないけど出来れば避けたい、とかっていう実情がありまして。
でまぁ否応なくコマンドラインで扱うPHP(いわゆるCLI版ってヤツですな)を調べ始めたのですが。
……いやぁphp.ini読む場所がおかしいおかしい。
とりあえず途中経過すっ飛ばして結論を。
自分のプログラムがどこ見てるかについては、
phpinfo()
をお使いください。
Configuration File (php.ini) Path => /usr/local/lib/php.ini
とかって感じで出力されますので(ああ結構な量が出てくるので、適宜パイプしてgrepなりリダイレクトでファイル保存なりしてくださいませ)。
で…優先順位なのですが。
- SAPI モジュール特有の場所 (Apache 2 における PHPIniDir ディレクティブ、 CGI/CLI 版における -c コマンドラインオプション、 NSAPI における php_ini パラメータ、 THTTPD における PHP_INI_PATH 環境変数)
- HKEY_LOCAL_MACHINE\SOFTWARE\PHP\IniFilePath (Windows レジストリの場所)
- PHPRC 環境変数
- 現在の作業ディレクトリ (CLI の場合)
- Web サーバのディレクトリ (SAPI モジュールの場合)、 もしくは PHP ディレクトリ (そうでない Windows の場合)
- Windows ディレクトリ (C:\windows もしくは C:\winnt)) (Windows の場合) 、もしくはコンパイル時のオプション --with-config-file-path
…なんじゃらほいこの優先順位は?
Apacheその他とむやみやたらに結びついてるわ作業ディレクトリのiniファイルの優先順位高いわ。何よりも如何なものか感満載なのが「なんでコンパイルオプションで明示している位置の優先順位がこんなに低い?」
…あきれ返って物も言えません。
ちなみに、/etcに場所を変えたときの、とりあえず問題ないから放置してるけどよくわからない挙動。
Configuration File (php.ini) Path => /etc/php.ini
Configuration File (php.ini) Path => /etc
この2種類がよくわからない規則性(…があるはずなんだけどなぁ……)で混在。なんでやねん。
とりあえずコマンドラインでやるときは明示的に -c で位置指定…なのかなぁ?
時々Webなんかで「複数バージョン混在環境には…」なんてのが載ってますが。「問答無用で優先順位が高いディレクトリには何もおくな」って警告を書いてあるところが見つからなかったので、一応ここで警告しておきます。
それにしても…使えば使うほどだめっぷりがスルメのように味わい深く噛み締められてしまう今日この頃………
そうそう。php.iniを書き直したとき、コマンドライン版はよいのですが、通常のWeb経由の場合、念のために「Web デーモンをrestart」しておきましょう。
…これもどうかと思うのですが。ええ。