k-holyのPHPとか諸々メモ

Webで働くk-holyがPHP(スクリプト言語)とか諸々のことをメモしていきます。ソースコードはだいたいWindowsで動かしてます。

XAMPPでPEARを入れ直した件、環境変数PHP_PEAR_SYSCONF_DIRを忘れずに

Apache 2.4のWindows版バイナリがApache Loungeに公開されてると知って、Windows7Apache 2.4 + PHP5.4環境に挑戦したものの、どうにも安定動作させられませんでした。
時間的な余裕もないので、とりあえずXAMPPのバージョンを1.7.4(PHP 5.3.5)から1.7.7(PHP 5.3.8)に更新したところ、今度はpearコマンドが混乱してしまいました。
以下、XAMPPでPEARを再インストールした記録です。

XAMPPに添付されているPEAR関連ファイルを削除する

まずXAMPPにデフォルトで添付されているPEARは不要なライブラリてんこ盛りなのでサクッと削除します。
cfg, data, DB, docs, PEAR, tests, Text, tmp, www といったディレクトリは全てPEAR関係なので、入れ直す際は全て削除して良いでしょう。

最新のgo-pear.pharを入手して環境変数 PHP_PEAR_SYSCONF_DIR を設定する

昔は go-pear.bat というスクリプトを実行してインストールしましたが、今は go-pear.phar を直接実行すればいいみたいです。

最新版の go-pear.phar はこちらのURLから入手できます。
http://pear.php.net/go-pear.phar

go-pear.phar をPHPインストールディレクトリに配置して、コマンドプロンプトを起動します。

$ cd c:\xampp\php

go-pear.phar を実行する前に、環境変数 PHP_PEAR_SYSCONF_DIR を設定します。

$ set PHP_PEAR_SYSCONF_DIR=C:\xampp\php

PHP 5.4をインストールした際、go-pear.phar を実行してpearコマンドといくつかのPEARライブラリをインストールしたんですが、デフォルト設定で入れてしまい、C:\Windows\pear.ini が残ったままになっていました。
で、上記環境変数を設定せず pear config-show を実行したところ、中途半端に前の設定が残ったままで、ディレクトリ関係の設定が c:\xampp\php以下だったりc:\php以下だったりとぐちゃぐちゃになってしまったわけです。

一応、上記のようにsetコマンドで設定することはできますが、新規コマンドプロンプトを開くたびに、User Configuration File がデフォルト値の C:\Windows\pear.ini に設定されてしまいますので、特に理由がなければ「システムのプロパティ」→「環境変数」で設定しておくと楽です。(画像参照)

※注意

コマンドプロンプトではなくシステムのプロパティで環境変数を設定した場合、もう一度コマンドプロンプトを開き直してください。

go-pear.pharを実行してpearコマンドをインストール

準備ができたら、go-pear.pharを実行します。

$ php go-pear.phar
Are you installing a system-wide PEAR or a local copy?
(system|local) [system] :

プロジェクトローカルではなくシステム全体のPEARをインストールしますので、そのまま [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:\xampp\php
 2. Temporary directory for processing            : C:\xampp\php\tmp
 3. Temporary directory for downloads             : C:\xampp\php\tmp
 4. Binaries directory                            : C:\xampp\php
 5. PHP code directory ($php_dir)                 : C:\xampp\php\pear
 6. Documentation directory                       : C:\xampp\php\docs
 7. Data directory                                : C:\xampp\php\data
 8. User-modifiable configuration files directory : C:\xampp\php\cfg
 9. Public Web Files directory                    : C:\xampp\php\www
10. Tests directory                               : C:\xampp\php\tests
11. Name of configuration file                    : C:\xampp\php\pear.ini
12. Path to CLI php.exe                           : C:\xampp\php

1-12, 'all' or Enter to continue:

前述の環境変数 PHP_PEAR_SYSCONF_DIR を設定しておけば、上記のようにInstallation baseが設定され、それに基づいたディレクトリの設定が行われます。
変更がなければ [Enter] を押してインストールします。

インストール完了後、pearコマンドをテストします。

$ pear version
PEAR Version: 1.9.4
PHP Version: 5.3.8
Zend Engine Version: 2.3.0
Running on: Windows NT HORII 6.1 build 7601 (Windows 7 Business Edition Service Pack 1) i586

問題ないようです。

php.iniを編集して、include_pathにPEARPHP code directory ($php_dir)が追加されているか確認します。

include_path = ".;\xampp\php\pear"

この行があればOKです。

pearコマンドの設定を変更してPEARを更新

次に、 pear config-show で設定内容を確認して、いくつか修正しました。

$ pear config-set php_ini C:\xampp\php\php.ini
$ pear config-set php_bin C:\xampp\php\php.exe
$ pear config-set cache_dir C:\xampp\php\cache
$ pear config-set preferred_state beta
$ pear config-set auto_discover 1

上から順に、php.ini の場所を明示、php.exe の場所を明示、キャッシュディレクトリをデフォルトの設定(%USERPROFILE%\AppData\Local\Temp\pear\cache)から変更、beta版のライブラリのインストールを有効に、PEARチャネルの自動登録を有効に設定しました。
次に、デフォルトのライブラリを全更新します。

$ pear upgrade-all

これで、PEAR環境はまっさらの状態になりました。

使いたいパッケージをインストールする(任意)

PEARの環境は新規の状態になりましたので、ここからは使いたいパッケージをインストールします。

今回はチャネル pear.piece-framework.com から 最新のStagehand_TestRunnerを入れました。

$ pear channel-discover pear.piece-framework.com
$ pear install --alldeps piece/stagehand_testrunner
....
(中略)
....
install ok: channel://pear.symfony.com/ClassLoader-2.0.12
install ok: channel://pear.symfony.com/Config-2.0.12
install ok: channel://pear.symfony.com/Console-2.0.12
install ok: channel://pear.symfony.com/DependencyInjection-2.0.12
install ok: channel://pear.symfony.com/Finder-2.0.12
install ok: channel://pear.symfony.com/Yaml-2.0.12
install ok: channel://pear.phpunit.de/Text_Template-1.1.1
install ok: channel://pear.phpspec.net/PHPSpec_Zend-1.3.0beta
install ok: channel://pear.survivethedeepend.com/Mockery-0.7.2
install ok: channel://pear.phpunit.de/File_Iterator-1.3.1
install ok: channel://pear.phpunit.de/PHP_Timer-1.0.2
install ok: channel://pear.symfony-project.com/YAML-1.0.6
install ok: channel://hamcrest.googlecode.com/svn/pear/Hamcrest-1.1.0
install ok: channel://pear.phpunit.de/PHP_TokenStream-1.1.3
install ok: channel://pear.piece-framework.com/Stagehand_AlterationMonitor-2.0.1
install ok: channel://pear.piece-framework.com/Stagehand_ComponentFactory-1.0.0
install ok: channel://pear.phpspec.net/PHPSpec-1.3.0beta
install ok: channel://pear.phpunit.de/PHP_CodeCoverage-1.1.2
install ok: channel://pear.phpunit.de/PHPUnit_MockObject-1.1.1
install ok: channel://pear.piece-framework.com/Stagehand_TestRunner-3.0.0
install ok: channel://pear.phpunit.de/PHPUnit-3.6.10

元々、PHP5.4を入れようとしたのも、XAMPP 1.7.4の環境で Stagehand_TestRunner 3.0.0 のAutotestがうまく動いてくれなかったので、最新の環境で検証しようとしたわけですが…。
そうこうしているうちに、私の環境で引っかかっていたものも含めて、いくつかの不具合が修正された 3.0.1 がリリースされました。

Stagehand TestRunner 3 0 1 (stable) リリースノート - Stagehand_TestRunner - Piece Framework
http://piece-framework.com/projects/stagehand-testrunner/wiki/Stagehand_TestRunner_3_0_1_(stable)_リリースノート


チャネル指定でのアップグレードには、以下のショートカットコマンドが利用できます。

$ pear up -c piece
Error getting channel info from pear.piece-framework.com: SECURITY ERROR: Will not write to C:\xampp\php\cache\32001299bdec0c8ddc33ac83b8014fafrest.cacheid as it is symlinked to C:\xampp\php\cache\32001299bdec0c8ddc33ac83b8014fafrest.cacheid - Possible symlink attack

おそらく Windows Vista 以降からだと思いますが、PEAR Installer cache directory (cache_dir) への書き込み時に上記のようなエラーが発生することがあります。
こういう場合は、pear clear-cache コマンドでキャッシュを破棄すればOKです。(ショートカットコマンドは pear cc)

$ pear cc
reading directory C:\xampp\php\cache
262 cache entries cleared

$ pear up -c piece
downloading Stagehand_TestRunner-3.0.1.tgz ...
Starting to download Stagehand_TestRunner-3.0.1.tgz (73,476 bytes)
.................done: 73,476 bytes
upgrade ok: channel://pear.piece-framework.com/Stagehand_TestRunner-3.0.1

3.0.1に更新して確認したところ、XAMPP 1.7.7添付のPHP5.3.8でも無事にAutotestが動いてくれました。

どうやらWindows環境でproc_open()関数利用時、標準入出力で2048バイト以上の文字列を扱った場合にハングアップするというバグがあり、その影響を受けていたようです。
http://piece-framework.com/issues/390

関連リビジョンのdiffを見たところ、Windows用の回避コードが追加されていました。
http://piece-framework.com/projects/stagehand-testrunner/repository/revisions/8d3a128c9ab3569f5ace7bac7e3143d84588cea6/diff/src/Stagehand/TestRunner/Process/Autotest/Autotest.php

@itemanさん素早い対応ありがとうございます。


以下、参考にしたサイトです。

Manual :: PEAR パッケージマネージャの取得とインストール
http://pear.php.net/manual/ja/installation.getting.php

Manual :: Checking if PEAR works
http://pear.php.net/manual/ja/installation.checking.php

PHP/PEARインストールメモ - Glamenv-Septzen.net
http://www.glamenv-septzen.net/view/40

PHP_PEAR_SYSCONF_DIRの件でソースを追跡して検証されていて、助かりました。
バージョン違いやプロジェクトローカル等、複雑な環境でPEARを使った経験がないので、色々分かってなかったようです…。