LoginSignup
0
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-07-27

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

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

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1