home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

PHP/PEARインストールメモ

PHP/PEARインストールメモ

PHP / PEARインストールメモ
id: 40 所有者: msakamoto-sf    作成日: 2007-09-11 21:08:00
カテゴリ: PHP 

とあるライブラリを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の実行

その前に、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    <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

に設定が書き込まれちゃうんですよ!!!!

違うの違うの違うの~~~~~!!!そっちじゃねぇ~~~~!!!

結論: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    <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/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

になるのも納得できました。


*1: この二つ、どう違うのかは未調査。いつか、リベンジ。

プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2008-12-21 21:12:16
md5:5452c45271edf15239aaad94872cdb98
sha1:133c9dbb19b87bc5efa23405e71f7bae1fe31838
コメント
コメントを投稿するにはログインして下さい。