2013年2月23日

PHPのextension追加時の注意点

自宅PCのPHPでxdebugを使おうとしたら、うまく読めなかったので原因と対応をメモ。
と言っても、原因は単純にphpizeのバージョン違いでした。

ちゃんとzend_exntesion=/path/to/xdebug.so
としてxdebugでvar_dumpをオーバーロードしてるのに表示が変わらなくて変だなーと思って原因を調べてみました。

phpinfoを見てみたら、xdebugの項目が無い・・!
ということでApacheのerror_logを見てみたら、こんなログが出ていました。
太字のところが大事な箇所です。

Failed loading /usr/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so:  dlopen(/usr/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so, 9): Symbol not found: _output_globals
  Referenced from: /usr/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so
  Expected in: flat namespace
 in /usr/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so
Xdebug requires Zend Engine API version 220090626.
The Zend Engine API version 220100525 which is installed, is newer.
Contact Derick Rethans at http://xdebug.org/docs/faq#api for a later version of Xdebug.

こちらを見てみたところ、peclでxdebugを再インストールすると動くよ!
っていうことだったので試しましたが結果は変わらず。

で、こういうときはオフィシャルに行ったらちゃんと書いてるんですよね・・

/full/path/to/php/bin/phpize
というところで、ん?と思い

$ which phpize
/usr/bin/phpize

$ locate phpize |grep bin |grep phpize$
/usr/bin/phpize
/usr/local/bin/phpize

おぉ、2ついる。
バージョンを見てみましょう。

$ /usr/bin/phpize --version
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626

$ /usr/local/bin/phpize --version
Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525

あぁ、これだ。
単にphpizeしてただけなので、動いているPHPとZend Engine APIのバージョンが合ってなかったんですね。
ということで、

$ cd /path/to/xdebug
$ /usr/local/bin/phpize
$ ./configure --enable-xdebug --with-php-config=/path/to/php-config
$ make
$ sudo make install

と、再コンパイル後にphp.iniのxdebugのextensionのパスを直してApacheを再起動したら無事に動きました。

コマンドのpathには気をつけましょう、という話でした。