[PHP-users 19986]Re: Cygwin環境でのPHP4.3.5RC1とpearコマンド

komura komura @ ma9.seikyou.ne.jp
2004年 1月 25日 (日) 01:52:50 JST


komura です。

参考にして頂いたメモを書いたのは私です。今、読み直してみると、いろいろと
誤字などが多いようですので、また修正しておきます。

他にも誤字や、間違いがあると思いますので、何か気になったことがありましたら、
指摘をお願いします。

On Sat, 24 Jan 2004 17:26:36 +0900
Toru Yamaguchi <tyamaguchi @ contents.ne.jp> wrote:

> (2) PHP4.3.5RC1のインストール
> 
> $ export PATH=$PATH:/usr/local/apache/libexec
> $ cd /usr/local/src
> $ wget http://downloads.php.net/ilia/php-4.3.5RC1.tar.bz2
> $ tar xjf php-4.3.5RC1.tar.bz2
> $ cd php-4.3.5RC1
> $ ./configure --with-apxs=/usr/local/apache/bin/apxs --enable-mbstring
> --enable-mbregex

特に問題は出ないと思いますが、PHP 4.3.4 からは、--enable-mbstring を
指定した場合、--enable-mbregex は必要なくなっているはずです。
マルチバイト正規表現が不必要の場合には --disable-mbregex を指定するように
変更されています。


> このままではpearコマンドはflock()の実装がおかしいのか
> 使えないようなので、PEARのRegistry.phpの302行目のflock失敗時のエラーを
> 無理やり書き換えてtrueを返すようにしたら

それほど詳しく調べた訳ではありませんので、間違っているかもしれませんが、
Registry.php のこの部分の処理では、実際に行っている処理を単純化すると、
以下のような処理をしているように見えます。

<?php
$lockfile = './lockfile';
touch( $lockfile );

$fp = fopen( $lockfile, 'r' );
$ret = (int)flock( $fp, LOCK_SH );
echo '$ret : ' . $ret . "\n";

$fp = fopen( $lockfile, 'r' );
$ret = (int)flock( $fp, LOCK_UN );
echo '$ret : ' . $ret . "\n";
?>

このスクリプトを Gentoo Linux 1.4 と Cygwin の両方で実行してみたところ、
以下のような結果になりました。

Gentoo Linux 1.4

$ret : 1
$ret : 1

Cygwin DLL 1.5.6-1

$ret : 1
$ret : 0

共有ロックした状態のファイルを fopen() でさらに開いてアンロックする
という PHP スクリプトの書き方に問題があるように思います。

とりあえず、Registry.php の 290 行目の

$this->lock_fp = @fopen($this->lockfile, $open_mode);

となっている部分を

if (!is_resource($this->lock_fp)) {
    $this->lock_fp = @fopen($this->lockfile, $open_mode);
}

に修正しても問題なく pear コマンドが使えるようになりました。


> ところでCygwin環境で開発されてる方ってどれほどいらっしゃるんですかね?
> Windowsで開発してる方は結構多いと思いますが、
> 皆さんどうされてるんでしょうか?

私の場合、Windows 環境では Cygwin をインストールして使っていますが、
ほとんどの場合、ターミナルで Linux などの別端末にログインして
しまいますので、Cygwin 上でスクリプトを書くことはほとんどありません。

Windows 環境しかない場合や、テスト環境としては Cygwin は非常に便利だ
と思います。

-- 
komura <komura @ ma9.seikyou.ne.jp>


PHP-users メーリングリストの案内