2014/11/23(日)FreeBSD における PHP 5.5.x の mysql サポート

2017/10/12 17:48 サーバ運営・管理
FreeBSD 9.3 にて、mysql 5.5.40 Server を Ports にて導入し、
PHP 5.5系にて mysql アクセスのサポートをしようと構築をかけると、
構築の最終段階(本当に構築の最終工程)で、
ext/mysqlnd/.libs/mysqlnd_ps_codec.o: In function `ps_fetch_float':
ext/mysqlnd/mysqlnd_ps_codec.c:233: undefined reference to `__extendsfsd'
ext/mysqlnd/mysqlnd_ps_codec.c:233: undefined reference to `__extendsddf'
のようなエラーが出て構築できない現象に嵌りました。
FreeBSD 10.x系 ではこのようなエラーは出ません。
おそらく gcc コンパイラ と clang コンパイラの違いなのでしょう。

PHP 5.5 におけるmysql サポートは複雑で、先ず、
・ mysql インタフェース
・ mysqli インタフェース
・ PDO-mysql インタフェース
の3種類あります。 
このうち、最初の mysql インタフェースは古いので、利用は非推奨。
将来のバージョンでは削除されることが決まっています。

mysqli は拡張 mysql インタフェース、 PDO-mysql は Perl で言うところの DBI インタフェースみたいなものです。

今どきの PHP アプリケーションは、mysqli と PDO-mysql を使うように強い推奨がなされている状態です。
さらに、この内部モジュールは、各インタフェース専用以外に3つを統合した mysqlnd というものがあり、構築オプションによっては mysqlnd をインストールするようになっている感じです。全部で mysql サポートがモジュール4つあるらしく、何故こういう面倒なことになっているのか、利用者には理解不能です。

どうやら、configure で指定する構築オプションの組み合わせで mysqlnd を使う場合に、上記のエラーとなるようです。
今のところ、FreeBSD 9.x 以下のバージョンで PHP 5.5 を mysql 対応にする場合、 configure のオプションは、必ず以下をつけるといいです。
--with-mysql=/usr/local
--with-pdo-mysql=/usr/local
--with-mysqli=/usr/local/bin/mysql_config
--disable-mysqlnd
--with-mysql-sock=/tmp/mysql.sock
ポイントは --disable-mysqlnd でmysqlnd を外す指定です。
環境によっては mysql の unix ソケットが検出できず、この場合も mysqlnd を使うように強制されてしまうようなので、明示的に指定します。

筆者は PHP も mysql も使いません。昔からこの類の変更が多いからです。
アプリケーションの寿命が長い perl と postgreSQL を多用しており、長い目でのメンテナンス工数の面からお勧めしています。