#navi_header|PHP| とあるライブラリをPEARにまとめようと思った。 ついでに、ローカル(Windows)の環境もPHP5にしようと思った。 で、最初はCGI形式にしてPHP4とPHP5の両方を動かせるようにすればいいや、と思っていろいろApacheの設定弄くったけど、上手く行かなくて挫折。 で、素直にPHP5を入れた後、PEARをきっちりとインストールしてみようと思った。 というのは、phpDocumentor等を入れると、何故か c:\php4 というディレクトリが勝手に作られてしまう。これが非常に邪魔だったので、なんとしてもこの問題をクリアしたかった。 #outline --------------- * 何処に入れるか。 個人的な環境では、以下のようにセッティングし、"pear_0"ディレクトリにインストールしようと目論んでいる。go-pear.batや、go-pear.pharは、PHP5に添付のファイルをコピー。 C:\in_vitro\ apps\ php4\ ... PHP4。PHPUnitとかで動かすかもしんない。 php5\ ... PHP5。 pear_0\ ... PEAR。とりあえず普通に使うものと言う意味で、"_0"。 go-pear.bat PEAR\go-pear.phar * go-pear.batの実行 その前に、go-pear.batを若干修正しておく。 @ECHO OFF set PHP_BIN=C:\in_vitro\apps\php5\php.exe %PHP_BIN% -d output_buffering=0 C:\in_vitro\apps\pear_0\PEAR\go-pear.phar pause 間違えてPHP4のバイナリを動かさないよう、PHP_BINをフルパスで指定。あと、これも間違ってPHP5に入っているPEARではなく、ちゃんと今回セッティングしたpear_0を見に行くようフルパスで指定。 で、動かす。 > cd c:\in_vitro\apps\pear_0 C:\in_vitro\apps\pear_0> go-pear.bat Are you installing a system-wide PEAR or a local copy? (system|local) [system] :(そのままENTER) Below is a suggested file layout for your new PEAR installation. To change individual locations, type the number in front of the directory. Type 'all' to change all of them or simply press Enter to accept these locations. 1. Installation base ($prefix) : C:\in_vitro\apps\pear_0 2. Temporary directory for processing : C:\in_vitro\apps\pear_0\tmp 3. Temporary directory for downloads : C:\in_vitro\apps\pear_0\tmp 4. Binaries directory : C:\in_vitro\apps\pear_0 5. PHP code directory ($php_dir) : C:\in_vitro\apps\pear_0\pear 6. Documentation directory : C:\in_vitro\apps\pear_0\pear\docs 7. Data directory : C:\in_vitro\apps\pear_0\pear\data 8. Tests directory : C:\in_vitro\apps\pear_0\pear\tests 9. Name of configuration file : C:\WINDOWS\pear.ini 10. Path to CLI php.exe : C:\in_vitro\apps\php5 1-10, 'all' or Enter to continue: all ここで、PEARディレクトリ内には純粋にライブラリとしてのPHPファイルしか入れたく無かった為、6, 7, 8を修正。あと、2と3が一緒なのもアレなので、3を修正。あと、9も修正した。後で顧みるに、9については結局意味が無かったようだけど・・・。 Installation base ($prefix) [C:\in_vitro\apps\pear_0] : Temporary directory for processing [$prefix\tmp] : Temporary directory for downloads [$prefix\tmp] : $prefix\downloads Binaries directory [$prefix] : $prefix\bin PHP code directory ($php_dir) [$prefix\pear] : Documentation directory [$php_dir\docs] : $prefix\docs Data directory [$php_dir\data] : $prefix\data Tests directory [$php_dir\tests] : $prefix\tests Name of configuration file [C:\WINDOWS\pear.ini] : $prefix\pear_0_system.ini Path to CLI php.exe [C:\in_vitro\apps\php5] : Below is a suggested file layout for your new PEAR installation. To change individual locations, type the number in front of the directory. Type 'all' to change all of them or simply press Enter to accept these locations. 1. Installation base ($prefix) : C:\in_vitro\apps\pear_0 2. Temporary directory for processing : C:\in_vitro\apps\pear_0\tmp 3. Temporary directory for downloads : C:\in_vitro\apps\pear_0\downloads 4. Binaries directory : C:\in_vitro\apps\pear_0\bin 5. PHP code directory ($php_dir) : C:\in_vitro\apps\pear_0\pear 6. Documentation directory : C:\in_vitro\apps\pear_0\docs 7. Data directory : C:\in_vitro\apps\pear_0\data 8. Tests directory : C:\in_vitro\apps\pear_0\tests 9. Name of configuration file : C:\in_vitro\apps\pear_0\pear_0_system.ini 10. Path to CLI php.exe : C:\in_vitro\apps\php5 1-10, 'all' or Enter to continue: (ContinueなのでENTER) ... ** WARNING! Old version found at C:\in_vitro\apps\pear_0\bin, please remove it or be sure to use the new c:\in_vitro\apps\pear_0\bin\pear.bat command The 'pear' command is now at your service at c:\in_vitro\apps\pear_0\bin\pear.bat ** The 'pear' command is not currently in your PATH, so you need to ** use 'c:\in_vitro\apps\pear_0\bin\pear.bat' until you have added ** 'C:\in_vitro\apps\pear_0\bin' to your PATH environment variable. Run it without parameters to see the available actions, try 'pear list' to see what packages are installed, or 'pear help' for help. For more information about PEAR, see: http://pear.php.net/faq.php http://pear.php.net/manual/ Thanks for using go-pear! これで、pear.batが c:\in_vitro\apps\pear_0\bin\pear.bat としてインストールされた。実際にrequireされるライブラリなどは、 c:\in_vitro\apps\pear_0\PEAR 配下になり、こちらは既にphp.iniのinclude_pathに追加済。 で、今回PHP5に入れ替えたのもあるため、いつもの環境設定バッチファイルを修正する。 c:\in_vitro\setenv.bat → REM PHP5 set PHP5_HOME=C:\in_vitro\apps\php5 REM PEAR_0 set PEAR_0_HOME=C:\in_vitro\apps\pear_0\bin ... set PATH=...;%PHP5_HOME%;%PEAR_0_HOME%;... ここら辺は大体こんな感じで、細かくはお好みでいつも手を抜いたり凝ったりしている箇所。 次が本題。 * PEARの設定の上手い保存方法について 最初、go-pear.batの実行時。 9. Name of configuration file : C:\in_vitro\apps\pear_0\pear_0_system.ini これを設定していた為、てっきりここに保存されるものだと・・・思っていた自分が阿呆でした。 ファイルは作られたのですが、普通に > pear install pear/PhpDocumentor とかすると、何故か c:\php5\pear\data docs とかできちゃうんですよねぇ~~~~。 C:\in_vitro>pear config-show CONFIGURATION (CHANNEL PEAR.PHP.NET): ===================================== Auto-discover new Channels auto_discover Default Channel default_channel pear.php.net HTTP Proxy Server Address http_proxy PEAR server [DEPRECATED] master_server pear.php.net Default Channel Mirror preferred_mirror pear.php.net Remote Configuration File remote_config PEAR executables directory bin_dir C:\in_vitro\apps\pear_0\bin PEAR documentation directory doc_dir C:\php5\pear\docs PHP extension directory ext_dir C:\in_vitro\apps\php5\ext PEAR directory php_dir C:\in_vitro\apps\pear_0\pear PEAR Installer cache directory cache_dir C:\DOCUME~1\FengJing\LOCALS~1\Temp\pear\cache PEAR data directory data_dir C:\php5\pear\data PEAR Installer download download_dir C:\DOCUME~1\FengJing\LOCALS~1\Temp\pear\cache directory PHP CLI/CGI binary php_bin C:\in_vitro\apps\php5\php.exe php.ini location php_ini PEAR Installer temp directory temp_dir C:\DOCUME~1\FengJing\LOCALS~1\Temp\pear\temp PEAR test directory test_dir C:\php5\pear\tests Cache TimeToLive cache_ttl 3600 Preferred Package State preferred_state stable Unix file mask umask 0 Debug Log Level verbose 1 PEAR password (for password maintainers) Signature Handling Program sig_bin c:\gnupg\gpg.exe Signature Key Directory sig_keydir C:\WINDOWS\pearkeys Signature Key Id sig_keyid Package Signature Type sig_type gpg PEAR username (for username maintainers) User Configuration File Filename C:\WINDOWS\pear.ini System Configuration File Filename C:\WINDOWS\pearsys.ini うぉ~~~い、Configuration Fileも知らない間に C:\WINDOWS になってるしぃ~~~!? で、この状態で > pear config-set test_dir c:\in_vitro\apps\pear_0\tests とかすると、 C:\WINDOWS\pear.ini に設定が書き込まれちゃうんですよ!!!! 違うの違うの違うの~~~~~!!!そっちじゃねぇ~~~~!!! ** 結論:PHP_PEAR_SYSCONF_DIR 環境変数を設定せよ。 なんでかは置いておきまして、答えを先に。 > set PHP_PEAR_SYSCONF_DIR=c:\in_vitro\apps\pear_0 という感じで、 '' pear.iniを配置するディレクトリを、PHP_PEAR_SYSCONF_DIR環境変数に設定しておく '' 事により、まず、Configuration Fileの位置が指定されます。 C:\in_vitro>set PHP_PEAR_SYSCONF_DIR=c:\in_vitro\apps\pear_0 C:\in_vitro>pear config-show CONFIGURATION (CHANNEL PEAR.PHP.NET): ===================================== Auto-discover new Channels auto_discover ... User Configuration File Filename c:\in_vitro\apps\pear_0\pear.ini System Configuration File Filename c:\in_vitro\apps\pear_0\pearsys.ini で、この状態で config-set を行うことで、今回の例であれば c:\in_vitro\apps\pear_0 の pear.ini と pearsys.ini に設定が書き込まれます。((この二つ、どう違うのかは未調査。いつか、リベンジ。)) ハイ、というわけで今回の完了状態: > C:\in_vitro>pear config-show CONFIGURATION (CHANNEL PEAR.PHP.NET): ===================================== Auto-discover new Channels auto_discover Default Channel default_channel pear.php.net HTTP Proxy Server Address http_proxy PEAR server [DEPRECATED] master_server pear.php.net Default Channel Mirror preferred_mirror pear.php.net Remote Configuration File remote_config PEAR executables directory bin_dir C:\in_vitro\apps\pear_0\bin PEAR documentation directory doc_dir C:\in_vitro\apps\pear_0\docs PHP extension directory ext_dir C:\in_vitro\apps\php5\ext PEAR directory php_dir C:\in_vitro\apps\pear_0\pear PEAR Installer cache directory cache_dir c:\in_vitro\apps\pear_0\cache PEAR data directory data_dir C:\in_vitro\apps\pear_0\data PEAR Installer download download_dir C:\in_vitro\apps\pear_0\downloads directory PHP CLI/CGI binary php_bin C:\in_vitro\apps\php5\php.exe php.ini location php_ini c:\in_vitro\apps\php5\php.ini PEAR Installer temp directory temp_dir C:\in_vitro\apps\pear_0\tmp PEAR test directory test_dir C:\in_vitro\apps\pear_0\tests Cache TimeToLive cache_ttl 3600 Preferred Package State preferred_state stable Unix file mask umask 0 Debug Log Level verbose 1 PEAR password (for password maintainers) Signature Handling Program sig_bin c:\gnupg\gpg.exe Signature Key Directory sig_keydir c:\in_vitro\apps\pear_0\pearkeys Signature Key Id sig_keyid Package Signature Type sig_type gpg PEAR username (for username maintainers) User Configuration File Filename c:\in_vitro\apps\pear_0\pear.ini System Configuration File Filename c:\in_vitro\apps\pear_0\pearsys.ini ** 種明かしと PEAR/Config.php の解説 PEARの設定値の秘密は、PEAR/Config.php ファイルにあります。 まず、今回関係してくる部分に注目し、PEAR/Config.php ファイルの構造を大雑把にまとめると以下のようになります。 - デフォルト値用を含めた定数定義部 if (getenv('PHP_PEAR_SYSCONF_DIR')) { define('PEAR_CONFIG_SYSCONFDIR', getenv('PHP_PEAR_SYSCONF_DIR')); } elseif (getenv('SystemRoot')) { define('PEAR_CONFIG_SYSCONFDIR', getenv('SystemRoot')); } else { define('PEAR_CONFIG_SYSCONFDIR', PHP_SYSCONFDIR); } // Default for master_server if (getenv('PHP_PEAR_MASTER_SERVER')) { define('PEAR_CONFIG_DEFAULT_MASTER_SERVER', getenv('PHP_PEAR_MASTER_SERVER')); } else { define('PEAR_CONFIG_DEFAULT_MASTER_SERVER', 'pear.php.net'); } ... - PEAR_Config クラス定義 class PEAR_Config extends PEAR -- 設定値の定義(上のデフォルト値はここで使われる) var $configuration_info = array( // Channels/Internet Access 'default_channel' => array( 'type' => 'string', 'default' => PEAR_CONFIG_DEFAULT_CHANNEL, 'doc' => 'the default channel to use for all non explicit commands', 'prompt' => 'Default Channel', 'group' => 'Internet Access', ), 'preferred_mirror' => array( 'type' => 'string', 'default' => PEAR_CONFIG_DEFAULT_CHANNEL, 'doc' => 'the default server or mirror to use for channel actions', 'prompt' => 'Default Channel Mirror', 'group' => 'Internet Access', ), ... -- コンストラクタ function PEAR_Config($user_file = '', $system_file = '', $ftp_file = false, $strict = true) { ... Config.phpの冒頭では大量のdefine文が出てきますが、その殆どが、設定値のデフォルト値です。$configuration_infoに指定されています。逆に言えばそれ以外の定数値は、別の用途になりますが、今回の調査対象外ですのでスルーします。 で、なんで c:\php4\pear とか c:\php5\pear とか作られちゃうの?ですが、デフォルト値でそうした値になっている箇所を追っていくと正体が掴めます。例えばdataやtestsを見てみましょう。 'data_dir' => array( 'type' => 'directory', 'default' => PEAR_CONFIG_DEFAULT_DATA_DIR, ... 'test_dir' => array( 'type' => 'directory', 'default' => PEAR_CONFIG_DEFAULT_TEST_DIR, ... →(getenvのブロックは除去して抽出) define('PEAR_CONFIG_DEFAULT_DATA_DIR', $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'data'); define('PEAR_CONFIG_DEFAULT_TEST_DIR', $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'tests'); で、$PEAR_INSTALL_DIR は何なのかを見ていくと、Config.phpの冒頭で if (!defined('PEAR_INSTALL_DIR') || !PEAR_INSTALL_DIR) { $PEAR_INSTALL_DIR = PHP_LIBDIR . DIRECTORY_SEPARATOR . 'pear'; } else { $PEAR_INSTALL_DIR = PEAR_INSTALL_DIR; } とあります。 もちろん、PEAR_INSTALL_DIR等という定数は定義せずに使用していますので、上の分岐に入ります。すると、PHP_LIBDIRという定数に"\pear"を付け足したものが$PEAR_INSTALL_DIRになることが分かりました。というわけで、 > php -r "echo PHP_LIBDIR;" C:\php5 これで、 C:\php5 + "\pear" => c:\php5\pear になり、この下にdataやらdocsやらtestsが作られる、と言うわけです。 さて、肝心の設定ファイルの位置ですが、コンストラクタにその部分が書かれています。 function PEAR_Config($user_file = '', $system_file = '', $ftp_file = false, $strict = true) { $this->PEAR(); PEAR_Installer_Role::initializeConfig($this); $sl = DIRECTORY_SEPARATOR; if (empty($user_file)) { if (OS_WINDOWS) { $user_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.ini'; } else { $user_file = getenv('HOME') . $sl . '.pearrc'; } } if (empty($system_file)) { if (OS_WINDOWS) { $system_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pearsys.ini'; } else { $system_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.conf'; } } UNIX系の場合はさておきまして(見れば同じ文脈でどうなるか、分かると思います。)、WINDOWSの場合は $user_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.ini'; $system_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pearsys.ini'; となるようです。では、PEAR_CONFIG_SYSCONFDIR の定義を追ってみると・・・ if (getenv('PHP_PEAR_SYSCONF_DIR')) { define('PEAR_CONFIG_SYSCONFDIR', getenv('PHP_PEAR_SYSCONF_DIR')); } elseif (getenv('SystemRoot')) { define('PEAR_CONFIG_SYSCONFDIR', getenv('SystemRoot')); } else { define('PEAR_CONFIG_SYSCONFDIR', PHP_SYSCONFDIR); } とあります。次の優先順位で PEAR_CONFIG_SYSCONFDIR の値を設定していることが分かります。 - PHP_PEAR_SYSCONF_DIR 環境変数 - SystemRoot 環境変数 - PHP_SYSCONFDIR 組込定数 ここから、PHP_PEAR_SYSCONF_DIR環境変数を設定することで、好みの場所のPEAR設定ファイルを参照することができる、と分かりました。 ちなみに、Windows版のPHP5では残り二つがどうなるかというと・・・ > php -r "echo getenv('SystemRoot');" C:\WINDOWS > php -r "echo PHP_SYSCONFDIR;" C:\php5 と言う形になり、デフォルトで C:\WINDOWS\pear.ini になるのも納得できました。 #navi_footer|PHP|