とあるライブラリをPEARにまとめようと思った。
ついでに、ローカル(Windows)の環境もPHP5にしようと思った。
で、最初はCGI形式にしてPHP4とPHP5の両方を動かせるようにすればいいや、と思っていろいろApacheの設定弄くったけど、上手く行かなくて挫折。
で、素直にPHP5を入れた後、PEARをきっちりとインストールしてみようと思った。
というのは、phpDocumentor等を入れると、何故か
c:\php4
というディレクトリが勝手に作られてしまう。これが非常に邪魔だったので、なんとしてもこの問題をクリアしたかった。
個人的な環境では、以下のようにセッティングし、"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を若干修正しておく。
@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%;...
ここら辺は大体こんな感じで、細かくはお好みでいつも手を抜いたり凝ったりしている箇所。
次が本題。
最初、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 <not set> Default Channel default_channel pear.php.net HTTP Proxy Server Address http_proxy <not set> PEAR server [DEPRECATED] master_server pear.php.net Default Channel Mirror preferred_mirror pear.php.net Remote Configuration File remote_config <not set> 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 <not set> 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 <not set> maintainers) Signature Handling Program sig_bin c:\gnupg\gpg.exe Signature Key Directory sig_keydir C:\WINDOWS\pearkeys Signature Key Id sig_keyid <not set> Package Signature Type sig_type gpg PEAR username (for username <not set> 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
に設定が書き込まれちゃうんですよ!!!!
違うの違うの違うの~~~~~!!!そっちじゃねぇ~~~~!!!
なんでかは置いておきまして、答えを先に。
> 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 <not set> ... 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 に設定が書き込まれます。(*1)
ハイ、というわけで今回の完了状態:
> C:\in_vitro>pear config-show CONFIGURATION (CHANNEL PEAR.PHP.NET): ===================================== Auto-discover new Channels auto_discover <not set> Default Channel default_channel pear.php.net HTTP Proxy Server Address http_proxy <not set> PEAR server [DEPRECATED] master_server pear.php.net Default Channel Mirror preferred_mirror pear.php.net Remote Configuration File remote_config <not set> 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 <not set> 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 <not set> Package Signature Type sig_type gpg PEAR username (for username <not set> 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の設定値の秘密は、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'); } ...
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環境変数を設定することで、好みの場所のPEAR設定ファイルを参照することができる、と分かりました。
ちなみに、Windows版のPHP5では残り二つがどうなるかというと・・・
> php -r "echo getenv('SystemRoot');" C:\WINDOWS > php -r "echo PHP_SYSCONFDIR;" C:\php5
と言う形になり、デフォルトで
C:\WINDOWS\pear.ini
になるのも納得できました。