Db2 on Cloud data warehouse (愛称 dashDB)の性能は、PHPから利用できれば インメモリの性能から、MySQL より優れいるかもしれない? とか考え、試みたメモです。 結果は残念でしたが、成功したケースよりも、失敗したケースとその失敗の原因を残すことが重要と思いますので、記事にしました。 これは個人が検証して得た結果であり、会社としての見解ではありませんので、ご了承ください。 また、Db2 on Cloud data warehouse を旧製品名 dashDB を愛称として表記しています。
これまでの筆者の dashDB に関する記事で、これは続編です。
- Macから"IBM Db2 Warehouse on Cloud" (旧DashDB)へコマンドライン接続
- python dashDBをアクセスするコードの作り方 on Bluemix or local
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