肉とビールとパンケーキ by @sotarok

少し大人になった「肉とご飯と甘いもの」

pecl install hoge でインストールしたとき、インストール先が extension_dir じゃないディレクトリになってしまう場合

Debain での話。

  • 手元で色々 PHP いじってて環境が微妙なことになってしまったとき
  • まぁ、こういうことになる人ってあんまいないと思うけど
$ sudo pecl install hoge

でインストールすると、

...
checking for PHP includes... -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib
checking for PHP extension directory... /usr/lib/php/20100525-debug
checking for PHP installed headers prefix... /usr/include/php
...

おや?
で、当然 /etc/php5/conf.d/http.ini とかに

extension=http.so

とか書いても、

$ php -v
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626/http.so' - /usr/lib/php5/20090626/http.so: cannot open shared object file: No such file or directory in Unknown on line 0
...

とかいわれる。
extension のインストールされたディレクトリと、phpの設定がもってる extension dir が違うようだ。

$ php -i | grep extension_dir
extension_dir => /usr/lib/php5/20090626 => /usr/lib/php5/20090626

となるから当然で。

あれ、じゃあなんで pecl install するときにここに入らないのだ、と思い一応 pecl config-show で確認。

$ pecl config-show
...
PHP extension directory        ext_dir          /usr/lib/php5/20090626
...

ちゃんとなっている。

ビルドのときには /usr/bin/php-config が使われるのでそれも確認

$ which php-config
/usr/bin/php-config
$ php-config
...
  --libs              [-lcrypt   -lz -lcrypt -lonig -lcrypto -lssl -lcrypto -ldb-4.8 -lqdbm -lbz2 -lz -lcrypto -lssl -lcrypto -lrt -lm -ldl -lnsl  -lxml2 -lgssapi_krb5 -
lkrb5 -lk5crypto -lcom_err -lxml2 -lxml2 -lxml2 -lcrypt -lxml2 -lxml2 -lxml2 -lxml2 -lcrypt ]
  --extension-dir     [/usr/lib/php5/20090626-debug]
  --include-dir       [/usr/include/php5]
...

あれ。

php-config は誰によってインストールされるか、

$ dpkg -S php-config
php5-dev: /usr/share/man/man1/php-config5.1.gz
php5-dev: /usr/bin/php-config5

php5-dev。だけど /usr/bin/php-config5 ってことは多分 /usr/bin/php-config は symlink にしてるんだな、と確認してみると、

$ ls -la /usr/bin/php-config
-rwxr-xr-x 1 root root 4570 2012-02-03 08:36 /usr/bin/php-config

あれ。実体だ。

つまり原因は、

  • 何かしらのタイミングで php-config が実体になっちゃった
  • php5-dev をインストールしなおしても、update alternatives が働かない
  • 何かしらのタイミングで実体になっちゃったものがずっとつかわれちゃってる
  • pecl install のときにおかしくなる

ということなので、 /usr/bin/php-config を削除して php5-dev のインストールしなおし

$ sudo rm /usr/bin/php-config
$ sudo apt-get remove php5-dev
$ sudo apt-get install php5-dev

...

php5-dev (5.3.10-1~dotdeb.1) を設定しています ...
update-alternatives: /usr/bin/php-config (php-config) を提供するために 自動モード で /usr/bin/php-config5 を使います。
update-alternatives: /usr/bin/phpize (phpize) を提供するために 自動モード で /usr/bin/phpize5 を使います。m

で、再度確認

$ ls -la /usr/bin/php-config
lrwxrwxrwx 1 root root 28 2012-02-06 11:47 /usr/bin/php-config -> /etc/alternatives/php-confi

$ php-config
...
  --libs              [-lcrypt   -lz -lcrypt -lonig -lcrypto -lssl -lcrypto -ldb-4.8 -lqdbm -lbz2 -lz -lcrypto -lssl -lcrypto -lrt -lm -ldl -lnsl  -lxml2 -lgssapi_krb5 -
lkrb5 -lk5crypto -lcom_err -lxml2 -lxml2 -lxml2 -lcrypt -lxml2 -lxml2 -lxml2 -lxml2 -lcrypt ]
  --extension-dir     [/usr/lib/php5/20090626]
  --include-dir       [/usr/include/php5
...

OK。
で、 pecl install してめでたし。

追記

最初の php-config のときに

  --version           [5.4.0beta1-dev]
  --vernum            [50400]

が出てたので自分で作ってた php5.4 の .deb をインストールしたときだなー間違いなく。

ますますこの問題おこるひとほとんどいないきがするよ。。
起こるとしたら、debian標準のaptから dotdeb に切り替えたとか、何かしら環境を変えた時とか。