具体的には、phpize の実行が必ず失敗する。
% sudo pecl install APC
downloading APC-3.1.6.tgz ...
Starting to download APC-3.1.6.tgz (148,835 bytes)
.................................done: 148,835 bytes
49 source files, building
running: phpize
Configuring for:
PHP Api Version: 20090626
Zend Module Api No: 20090626
Zend Extension Api No: 220090626
ERROR: `phpize' failed
peclが使えないと、新しく環境構築するたびにいちいち手でビルドするのが面倒なので、この際調べてみた。すると、{/usr/local/lib/php/}PEAR/Builder.php の 関数_runCommand()内、関数pclose()が、正しいファイルハンドルを渡しているのに常に失敗することがわかった。
function _runCommand($command, $callback = null)
{
:
略
:
if ($callback && isset($olddbg)) {
$callback[0]->debug = $olddbg;
}
$exitcode = is_resource($pp) ? pclose($pp) : -1;
return ($exitcode == 0);
}
pclose()が -1 を返すので、結果がいつも false だ。
ナンデダ!と思って情報を探ったところ、PHPのconfigureオプションで--enable-sigchildを付けるとpclose関数で-1が返るという情報を発見。
むう。なるほど。。。
ということは、
- --enable-sigchildを付けないPHPにする
- peclを使わずいつも手で入れる
- _runCommand()をなんとかする
1.をするのがマットウと思えるが、今回は2.のために、PECLっぽく引数を与えるとソースをダウンロードしてコンパイルしてインストールする、というのをスクリプトで自動化してみた。
#!/bin/sh
tgz=`pecl download $2 | awk '/downloading/{print \$2;}'`
dir=`echo "${tgz}" | sed 's/\.tgz//'`
case "$1" in
"install" )
tar xvfz ${tgz}
cd ${dir}
phpize
./configure
make
make test
make install
cd ..
;;
"download" )
exit
;;
* )
echo "$0 {install,download} package"
;;
esac
rm -rf ${tgz} ${dir}
こんなスクリプト peclinstaller.sh を作って、peclinstaller.sh install APC などとする。インストール済かどうかの管理は出来ないけど、とりあえず初期環境構築の時の省力化にはアリかな。
あるいは、Builder.php の _runCommand() を
$exitcode = is_resource($pp) ? (($pret = pclose($pp)) == -1 ? 0 : $pret) : -1;
とかしちゃうのも逃げとしてはアリか?
▼レンタルサーバー・VPS比較表を見る▼