PHP PDOで Db2 on Cloud data warehouse (愛称 dashDB) は繋がるか？ 失敗ケース


Db2 on Cloud data warehouse (愛称 dashDB)の性能は、PHPから利用できれば インメモリの性能から、MySQL より優れいるかもしれない？　とか考え、試みたメモです。　結果は残念でしたが、成功したケースよりも、失敗したケースとその失敗の原因を残すことが重要と思いますので、記事にしました。 これは個人が検証して得た結果であり、会社としての見解ではありませんので、ご了承ください。 また、Db2 on Cloud data warehouse を旧製品名 dashDB を愛称として表記しています。


これまでの筆者の dashDB に関する記事で、これは続編です。

* [Macから"IBM Db2 Warehouse on Cloud" (旧DashDB）へコマンドライン接続](http://qiita.com/MahoTakara/items/fc50da14d8cd38ac5a42)
* [python dashDBをアクセスするコードの作り方 on Bluemix or local](http://qiita.com/MahoTakara/items/460de0db25f4dd1ea7d8)


## PHPとdashDBの接続

PHPからIBM DB2製品に接続するモジュールとして、PDOドライバーが提供されています。(1),(2) また、IBM ナレッジ・センターには、DB2やdashDBと接続するためのノウハウが公開されています。(3),(4) また、Bluemix の PHPランタイムから、dashDBを使う方法についても、記載があります。(3) それなりに情報があるので、試して見たいと思います。　

Bluemixでアプリを開発する場合、すべてをBluemixで開発するよりも、ローカルでコードを書いて、BluemixのCFコンテナとして、デプロイすることが作業効率が良い(5)ので、まずはローカルの開発環境のPHPコードから、dashDBのアクセスについて検討していきます。


## ドライバーパッケージの利用

PHPからのアクセスのために、IBMからPHP用のPDOドライバーが提供されています。(6) このウェブページのリンクから、 IBM Data Server Driver Package (DS Driver ) をクリックして、Mac,Windows,Linux など用にビルドされたドライバーを入手することができます。

このドライバーをMacにインストールすると、次の様に、/Application/dsdriverの下に展開されます。 このディレクトリを見れば、phpのドライバーが含まれていることも、わかります。


~~~
imac:dsdriver maho$ pwd
/Applications/dsdriver
imac:dsdriver maho$ ls -al
total 144
drwxr-xr-x  25 maho  admin    850  7 26 08:28 .
drwxrwxr-x+ 82 root  admin   2788  7 26 08:22 ..
-rw-r--r--   1 maho  admin      4  7 26 08:28 .ftok
drwxr-xr-x   4 maho  admin    136  6 10  2016 adm
drwxr-xr-x@ 12 maho  admin    408  7 26 08:22 bin
drwxr-xr-x  12 maho  admin    408  6 10  2016 bnd
drwxr-xr-x   7 maho  admin    238  7 26 09:06 cfg
drwxrwsr-t   3 maho  admin    102  6 10  2016 cfgcache
drwxr-xr-x   4 maho  admin    136  6 10  2016 conv
-r--r--r--   1 maho  admin   2365  7 26 08:22 db2cshrc
drwxr-xr-x   3 maho  admin    102  7 26 08:28 db2dump
-r--r--r--   1 maho  admin   2241  7 26 08:22 db2profile
drwxr-xr-x  14 maho  admin    476  6 10  2016 include
-r-xr-xr-x@  1 maho  admin  56439  7 26 08:21 installDSDriver
-rw-r--r--   1 maho  admin   2699  7 26 08:22 installDSDriver.log
drwxr-xr-x@ 60 maho  admin   2040  7 26 08:21 java
drwxr-xr-x@  4 maho  admin    136  7 26 08:21 json
drwxr-xr-x   9 maho  admin    306  6 10  2016 lib
drwxr-xr-x@ 25 maho  admin    850  7 26 08:22 license
drwxr-xr-x   3 maho  admin    102  6 10  2016 msg
drwxr-xr-x@  3 maho  admin    102  7 26 08:21 php
drwxr-xr-x   3 maho  admin    102  7 26 08:22 python
drwxr-xr-x@  4 maho  admin    136  7 26 08:21 rdf
drwxr-xr-x@  3 maho  admin    102  7 26 08:21 ruby
drwxr-xr-x@ 10 maho  admin    340  7 26 08:21 tools
~~~

このPHPのディレクトリの中には、次の様に、pdoから始まるドライバーが含まれていることが解ります。

~~~
imac:php64 maho$ pwd
/Applications/dsdriver/php/php64
imac:php64 maho$ ls -la
total 544
drwxr-xr-x@ 7 maho  admin    238  7 26 08:22 .
drwxr-xr-x@ 3 maho  admin    102  7 26 08:21 ..
-r--r--r--@ 1 maho  admin   2148  7 26 08:21 README
-r-xr-xr-x@ 1 maho  admin  82364  7 26 08:21 ibm_db2_5.3.6_nts.so
-r-xr-xr-x@ 1 maho  admin  86676  7 26 08:21 ibm_db2_5.3.6_ts.so
-r-xr-xr-x@ 1 maho  admin  47216  7 26 08:21 pdo_ibm_5.3.6_nts.so
-r-xr-xr-x@ 1 maho  admin  47416  7 26 08:21 pdo_ibm_5.3.6_ts.so
~~~

## phpenv 開発環境のPHP最新バージョンへ組み込み

PHPの開発環境には、フォルダー毎にPHPを利用するバージョンを管理できるphpenv、php-build を利用すると便利です。(7) そこで、このphpenvのディレクトリに、前述のPDOドライバーを組み込んで動作確認したいと思います。

phpenv の環境では、自分のホームディレクトリ .phpenv の下に、バージョン毎に実行環境がインストールされます。 この一つ 7.1.7 に組み込んで見たいと思います。

~~~
imac:versions maho$ pwd
/Users/maho/.phpenv/versions
imac:versions maho$ ls -al
total 0
drwxr-xr-x   5 maho  staff  170  7 26 16:38 .
drwxr-xr-x  16 maho  staff  544  7 22 16:59 ..
drwxr-xr-x  11 maho  staff  374  7 17 22:08 5.6.30
drwxr-xr-x  11 maho  staff  374  7 26 16:50 7.1.5
drwxr-xr-x  11 maho  staff  374  7 20 19:05 7.1.7
~~~

階層が深くなりますが、次の場所に、php.ini で定義される動的ライブラリが配置されています。 この中に前述のドライバーをコピーします。

~~~
imac:no-debug-non-zts-20160303 maho$ pwd
/Users/maho/.phpenv/versions/7.1.7/lib/php/extensions/no-debug-non-zts-20160303
imac:no-debug-non-zts-20160303 maho$ ls
ibm_db2_5.3.6_nts.so	opcache.so		pdo_mysql.so
ibm_db2_5.3.6_ts.so	openssl.so		pdo_pgsql.so
mbstring.so		pdo_ibm_5.3.6_nts.so	pgsql.so
opcache.a		pdo_ibm_5.3.6_ts.so	xdebug.so
~~~

次に、phpenv configure コマンドを使って、選択中の php.ini を編集して、モジュールを追加します。

~~~
 910 ;extension=php_pgsql.dll
 911 ;extension=php_shmop.dll
 912 
 913 ; The MIBS data available in the PHP distribution must be installed.
 914 ; See http://www.php.net/manual/en/snmp.installation.php
 915 ;extension=php_snmp.dll
 916 
 917 ;extension=php_soap.dll
 918 ;extension=php_sockets.dll
 919 ;extension=php_sqlite3.dll
 920 ;extension=php_sybase_ct.dll
 921 ;extension=php_tidy.dll
 922 ;extension=php_xmlrpc.dll
 923 ;extension=php_xsl.dll
 924 
 925 extension=pdo_ibm_5.3.6_ts.so  <-- ココ
 926 
~~~

これで、準備が整いました。 php -m コマンドで、モジュールが組み込まれている事を確認しましょう。次の様に、libdb2.dylib が無いというメッセージが出ています。
この対処方法について、ドライバーパッケージの README.txt や IBM Knowledge Center にも何の記載もありません、困りました。

~~~
imac:dashdb maho$ php -m
<中略>
PHP Warning:  PHP Startup: Unable to load dynamic library '/Users/maho/.phpenv/versions/7.1.7/lib/php/extensions/no-debug-non-zts-20160303/pdo_ibm_5.3.6_ts.so' - dlopen(/Users/maho/.phpenv/versions/7.1.7/lib/php/extensions/no-debug-non-zts-20160303/pdo_ibm_5.3.6_ts.so, 9): Library not loaded: libdb2.dylib
  Referenced from: /Users/maho/.phpenv/versions/7.1.7/lib/php/extensions/no-debug-non-zts-20160303/pdo_ibm_5.3.6_ts.so
  Reason: image not found in Unknown on line 0
~~~

確かに、pdo_ibm_5.3.6_ts.so が存在するのに、libdb2.dylibが無いと警告を出しています。　この原因を探るために、otool で依存するライブラリを確認します。 リストされたライブラリのリストから、libdb2.dylib となっており、パスが無いことが解ります。

~~~
imac:php64 maho$ otool -L pdo_ibm_5.3.6_ts.so 
pdo_ibm_5.3.6_ts.so:
	libdb2.dylib (compatibility version 0.0.0, current version 0.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
~~~

そこで、pdo_ibm_5.3.6_ts.so のライブラリのロードパスを /Application/dsdriver/lib/libdb2.dylib に書き換えます。 

~~~
imac:no-debug-non-zts-20160303 maho$ sudo install_name_tool -change libdb2.dylib /Applications/dsdriver/lib/libdb2.dylib pdo_ibm_5.3.6_ts.so 
~~~

結果を確認して見ます。 次の様にライブラリの場所が変更されており、動的ライブラリを読める様になるはずです。

~~~
imac:no-debug-non-zts-20160303 maho$ otool -L pdo_ibm_5.3.6_ts.so 
pdo_ibm_5.3.6_ts.so:
	/Applications/dsdriver/lib/libdb2.dylib (compatibility version 0.0.0, current version 0.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
~~~

再度、php -m で動的ライブラリとのリンクを確認して見ます。 残念ですが、IBMがドライバーパッケージに提供する PDOモジュールは、ビルドされた時期が古く、初期化できなかった事が解ります。今回、php 5.6.30 と 7.1.7 の二つで試しましたが、結果は同じでした。

~~~
imac:dashdb maho$ php -m
PHP Warning:  PHP Startup: pdo_ibm: Unable to initialize module
Module compiled with module API=20090626
PHP    compiled with module API=20131226
These options need to match
 in Unknown on line 0
[PHP Modules]
bcmath
bz2
~~~

## PHP 5.3.6のケース

ドライバ・パッケージには、5.3.6 とバージョンらしき表示がありますから、phpenv を使って 5.3.6 に変更してテストした結果、php -m で警告も出ず、組み込まれていることが確認できました。

~~~
imac:dashdb maho$ php -m
[PHP Modules]
<中略>
pdo_ibm
~~~


## まとめ

PHPのバージョンを下げて、対応するしか無いので、この方向でのアプローチは、打ち切りとします。 現在の段階で、ドライバ・パッケージに含まれるPHPのドライバーでは、PHPの最新バージョンからdashDBはアクセスできないという結果になりました。 参考資料(3)のソースコードは、ODBC接続となっていますので、次は、ODBC接続を試みて見たいと思います。



## 参考資料
(1) PHPマニュアル, PDO_IBM DSN, http://php.net/manual/ja/ref.pdo-ibm.connection.php
(2) PECL, POD_IBM, https://pecl.php.net/package/PDO_IBM
(3) IBM Knowledge Center, dashDB Connecting to a Db2 database in a PHP, application
https://www.ibm.com/support/knowledgecenter/SS6NHC/com.ibm.swg.im.dashdb.doc/connecting/connect_connecting_php.html
(4) IBM Knowledge Center, DB2 Version 9.7 for Linux, UNIX, and Windows, Linux または UNIX での IBM データ・サーバー製品のための PHP 環境のセットアップ, https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_9.7.0/com.ibm.swg.im.dbclient.php.doc/doc/t0011926.html
(5) Qiita,Bluemix CFアプリをスクラッチからのコードを書く時のメモ,http://qiita.com/MahoTakara/items/660f973c74c1f3682eaa
(6) IBM Suport 初期Version 11.1クライアントおよびドライバーのダウンロード,https://www-01.ibm.com/support/docview.wss?uid=swg21385217
(7) Qiita, PHPの開発環境を作るためのリンク集と実施例, http://qiita.com/MahoTakara/items/41a81630f35cd7d56319