PHPとインメモリSQLデータベースDb2(DBaaS)が繋がったら無敵じゃね？ 


PHP5.6系/7.1系の最新バージョンとDb2を連携するビルドパックの開発メモです。 PHPはクラウドを利用するエコシステムで、最も普及している開発言語なんだと思います。バックエンドのRDBには、MySQLやPostgrSQLが一般的ですが、アプリサーバーは水平分散クラスタを構成できるのですが、RDBサーバの並列分散クラスタは運用が難しく悩みのタネになるケースが多い様です。

そこで、もしDb2を適用したら一気に問題が解決するんじゃないの？ と思い立ち、本番サービスを意識してPHPは最新バージョンを考慮して、次の記事、[PHP PDOで Db2 on Cloud data warehouse (愛称 dashDB) は繋がるか？ 失敗ケース](http://qiita.com/MahoTakara/items/5ad42737da72c149e377) で挑戦してみましたが、Db2のドライバ・パッケージのPDOドライバが、PHPの古いバージョンにしか対応しておらず失敗(1)、そこで、ソースコードからビルドするべく、[PHP最新バージョン5.6系／7系からのDb2接続](http://qiita.com/MahoTakara/items/24cd9acd0249186ea617)で、PHPの5.6系と7.1系の最新バージョンで繋がることを確認しました。(2)

しかし、この接続をBluemixのランタイムで実現するためには、ビルドパックに手を加えなければ成りません。 PHP最新バージョンとDb2が連携できるBuildpackのビルドについて検証したメモです。

## 目指す構成

次の図が、最終的に目指す構成で、PHPがDb2をアクセスするアプリケーションの実行環境を構築します。 このPHPのランタイムは、Cloud Foudry の php-buildpacke (3) がベースで、Weサーバーに Apache HTTPD または Nginx を選択でき、PHPは5.6系、7.1系のLatest Version を指定できます。また、PHPの実行には、FastCGI Process Manager (FPM)を利用します。 

![スクリーンショット 2017-08-05 0.03.43.png](https://qiita-image-store.s3.amazonaws.com/0/42829/aef1e181-42f3-baab-59c9-7be58b076fff.png "スクリーンショット 2017-08-05 0.03.43.png")




## ビルドパック開発環境

次の図は、前述の構成を実現するために、作ったビルドパックの開発環境です。 この図のそれぞれの要素について、左上から順に説明を書いていきます。

![スクリーンショット 2017-08-06 21.35.36.png](https://qiita-image-store.s3.amazonaws.com/0/42829/50ea46ae-4f5c-2572-380f-42a02936a6e6.png "スクリーンショット 2017-08-06 21.35.36.png")



#### 1 GitHub Cloud Foundry php-buildpack  

Cloud Foundry社が開発しているPHPのビルドパックです。(3)　このビルドパックのマニュアルは(4)にあります。 このビルドパックでは、Apache HTTPD, Nginx, PHP, Dynatrace, NewRelic を設定できる様になっており、現在も開発が続いています。 このBuildpackeの開発状況は、Pivotal Tracker で参照できます。(5) 

今回は、PHPビルドパックを拡張して、Db2へ接続するODBCドライバ、PHPのPDO-IBMドライバを追加します。


#### 2 GitHub Private custom-buildpack 

Cloud Foundry のPHPビルドパックを拡張するために、GitHubでforkして設定します。(6) 設定を追加するファイルは、manifest.yml です。 このmanifest.ymlには、ビルドパックが依存するApache HTTP, Nginx, PHPなどのダウンロード元が記載されていますから、Db2のドライバを組み込んだPHPのダウンロード元を登録します。


#### 3 PHP binary tgz (Object Storage)
GitHubの１ファイルの最大サイズは、50MBですから、PHPの実行形式のアーカイブのtgzファイルを登録できません。そこで、Bluemix IaaS のオブジェクト・ストレージにtgzファイルを登録します。 オブジェクト・ストレージのIDとAPI Keyを取得する方法は、参考資料(7)を参照してください。 オブジェクト・ストレージへのファイルの保存のツールとして、参考資料(8)のPythonプログラムを利用します。 事前に、オブジェクト・ストレージのID取得と、オブジェクト・ストレージのツールのセットアップを済ませておくと、効率良く進めることができます。 


#### 4 PHP (Runtime) 
Bluemix のカタログにも、PHPランタイムが提供されており、Db2をODBCでアクセスするためのカスタムビルドパックを利用することができます。(9) しかし、このビルドパックのバージョンは、参考資料(10)によれば、使用可能なPHPのバージョンが少し古く、ソースの出処が明確でないため、障害時に対応が出来なくなる懸念があります。 そこで、このビルドパックの利用を避け、Cloud FoundryのPHPビルドパック(3)を利用します。


#### 5 Db2 (DBaaS)
Bb2 のシリーズには、Db2 Warehouse on Cloud(11), Bb2 Hosted(12), Db2 on Cloud(13) が利用でき、いづれも同じドライバを利用して接続できます。今回は無料で使えるDb2 Warehouse on Cloudを利用します。


#### 6 Data Storage Driver
Db2へODBC接続するためのドライバーは、Bluemix の管理画面からダウンロードします。 このダウンロード方法は、参考資料(14)にあります。 今回は、PCのOSにインストールするのではなく、Vagrant + VirtualBoxの上で動く、Ubuntu Linux 14.04 を対象としてダウンロードします。


#### 7 secure.php.net
PHPのソースコードは、http://secure.php.net/ のダウンロードページから入手します。 オープンソースなので、正式な入手元であること、そして、ハッシュの結果が一致しており、何らかの悪意のあるコードが混入する可能性が無いものを利用します。(15)

#### 8 PDO-IBM
PHPのPDOドライバーのソースコードの入手元で、URLは https://pecl.php.net/package/PDO_IBM です。(16) 最新の stable なバージョンを利用します。以下はPDOについての説明です。(17)

	PHP Data Objects (PDO) 拡張モジュールは、 PHP の中からデータベースにアクセスするための軽量で高性能な インターフェイスを定義します。 PDO インターフェイスを実装する各データベースドライバは、 正規表現関数のようなデータベース固有の機能を提供することができます。 PDO 拡張モジュールによりそのデータベースの全てのデータベース関数を 実行できるわけではないことに注意してください。 データベースサーバーにアクセスするには、 データベース固有の PDO ドライバ を使用する必要があります。

	PDO は、データアクセスの抽象化レイヤを提供します。 つまり、使用しているデータベースが何であるかにかかわらず、同じ 関数を使用してクエリの発行やデータの取得が行えるということです。 PDO は、データベースの抽象化を行うのでは ありません。つまり、SQL を書き直したり 存在しない機能をエミュレートしたりはしないということです。 もしそのような機能が必要なら、全体を網羅する (full-blown) 別の抽象化レイヤを使用すべきです。 



#### 9 Development Machine

今回は、ビルドパックのOSをターゲットに実行モジュールを作る必要があります。 そこで、MacやWindowsのOS環境ではなく、Cloud Foundry のビルドパックの OS環境である必要があります。 現在利用できるビルドパックについて、次のコマンドで知ることができます。

~~~
bx cf stacks
~~~

Blusemix での実行結果は次の内容で、現在の利用されているものは、cflinuxfs2 となっており、Ubuntu 14.04 であることが解ります。

~~~
Invoking 'cf stacks'...

name         description
lucid64      Ubuntu 10.04
seDEA        private
cflinuxfs2   Ubuntu 14.04.2 trusty
~~~

この内容は、Cloud Foundry の General Information にも Available Stacks として記載されています。(18)  cflinuxfs2は、GitHubにコードが公開され、利用しているライブラリのリストもあります。(19)

Development Machine と表した開発環境は、MacやWindows 環境に、Vagrant と Virtual Box を利用して、Ubuntu 14.04 のビルド用OS環境を作ります。 このビルド用環境は、公開されているものが見つけられなかったので、独自に作成して Vagrantfile を GitHub https://github.com/takara9/bluemix-dev で公開(20)しておきましたので、vagrant + VirtualBox環境が設定した後、このGitHub の Vagrantfile を使って、開発用の仮想マシンを起動してください。


## PHPビルドパックの理解

参考資料(21) の php-buildpack の README.md を日本語に翻訳しておきました。この中の一部を引用します。


ビルドパックを理解する最も簡単な方法は、スクリプトの流れをトレースすることです。 buildpackシステムは、buildpackによって提供されたcompile, release そして、detect スクリプトを呼び出します。 これらは、一般的にbinディレクトリの下にあります。 スクリプト・ディレクトリの対応するPythonスクリプトにリダイレクトされます。

これらのうち、detectスクリプトと releaseスクリプトは、簡単でビルドパックで必要とされる最小の機能を提供します。 compileスクリプトはもっと複雑ですが、このように動作します。

* 負荷設定
* WEBDIRディレクトリを設定
* buildpack utilsとコア拡張（HTTPD、Nginx＆PHP）のインストール
* 他の拡張機能をインストール
* 書き換えスクリプト、および、インストールスクリプト のインストール
* 実行時環境とプロセスマネージャをセットアップ
* startup.shスクリプトを生成

一般的に、ビルドパック自体を変更する必要はありません。 代わりに拡張機能を作成が必要です。

これによると、compile スクリプトの中から、PHPのコードがダウンロードされる事が解ります。 さらに、この部分をコードで確認すると、bin/compile から bin/finalize が呼び出され、scripts/compile.py が実行されいます。この中から、manifest.ymlが読み込まれ依存する拡張モジュールをダウンロードしている事が解ります。 そこで、manifest.ymlに変更を加えて、Db2のモジュールをダウンロードする様にします。


## PHPのビルド環境の準備
ここから、とても面倒な作業になっていきますが、混乱しない様に、一つ一つ正確に進めていきます。


### 仮想マシンの起動

前述の図に表した様に、開発環境をローカルマシンのVagrantで構築していきます。 仮想マシンを起動するための Vagrantfile を次の方法で、GitHubから入手します。

~~~
git clone https://github.com/takara9/bluemix-dev php_db2_build
~~~

ディレクトリを移動して、仮想マシンを開始します。　Vagrantfile の記述に従って、Ubuntu14.04 のイメージをダウンロードして、apt-get を実行して、ビルドに必要な最小限のファイルセットをインストールします。 ネットワークの環境が良い場所でも、10分程度必要です。

~~~
cd php_db2_build
vagrant up
~~~

### 仮想マシンへのログイン

仮想マシンの起動が完了したら、Vagrantfile が存在している同じディレクトリから、次のコマンドで、ログインします。　ログインすれば、クラウドの仮想さーバート同じ様に、利用できます。

~~~
vagrant ssh
~~~


### 必要な材料の収集

仮想マシン上に、必要な作業場所を確保して、ビルドパックのPHP拡張バイナリをビルドするために必要なファイルを集めていきます。 次の様にビルドの作業用ディレクトリを作って、必要な tar ファイルを集めます。

~~~
mkdir wk-5.6.31
cd wk-5.6.31
pwd
/home/vagrant/wk-5.6.31
ls -a
.  ..  ibm_data_server_driver_package_linuxx64_v11.1.1.tar.gz  PDO_IBM-1.3.4.tgz  php-5.6.31.tar.gz
~~~

#### PHPのソースコードのダウンロード

次の方法でファイルを集めて、それぞれ、作業用ディレクトリで展開します。

PHP 5.6系のケース

~~~
wget http://jp2.php.net/get/php-5.6.31.tar.gz/from/this/mirror -O php-5.6.31.tar.gz
~~~

PHP 7.1系のケース

~~~
wget http://jp2.php.net/get/php-7.1.8.tar.gz/from/this/mirror -O php-7.1.8.tar.gz
~~~


#### PDOドライバ PDO-IBMのダウンロード

参考資料(16)のPECL PDO_IBMのウェブページを参考にして、ダウンロードします。

~~~
curl -O https://pecl.php.net/get/PDO_IBM-1.3.4.tgz
~~~


#### Data Storage Driver パッケージのダウンロード

Bluemix の Db2 の管理画面からダウンロードします。 詳しくは、参考資料(2)を参照ください。　
作業様ディレクトリで展開して、その場所にインストールします。

~~~
cd dsdriver
./installDSDriver
~~~

インストールが完了したら、次のコマンドで、db2の環境変数を取り込みます。

~~~
. ./dsdriver/db2profile
~~~



## ビルドに必要な追加 SWパッケージの導入

PHPの拡張モジュールをビルドするための configure のオプションにも依存しますが、Ubuntu 14.04 への追加パッケージとして、次のコマンドを実行します。

~~~
apt-get install libdb-dev libgdbm-dev postgresql-server-dev-9.3 dovecot-dev libc-client-dev libkrb5-dev libc-client2007e-dev libgmp-dev libgmp3-dev libldap2-dev libldap-2.4-2  libpspell-dev libsasl2-dev
~~~

導入されているモジュールが認識されないケースに対応して、シンボリック・リンクを設定しておきます。

~~~
ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h
ln -s /usr/lib/x86_64-linux-gnu/libldap.so /usr/lib/libldap.so
ln -s /usr/lib/x86_64-linux-gnu/liblber.so /usr/lib/liblber.so
~~~



## PHP本体のコンパイル

環境変数 WORKING_DIR を設定して、PHPのソースコードを展開したディレクトリで、以下のオプションを付与して configureを実行します。 

~~~
export WORKING_DIR=wk-5.6.31

./configure \
--prefix=/home/vagrant/$WORKING_DIR/php \
--disable-static \
--enable-shared \
--enable-ftp=shared \
--enable-sockets=shared \
--enable-soap=shared \
--enable-fileinfo=shared \
--enable-bcmath \
--enable-calendar \
--with-kerberos \
--enable-zip=shared \
--with-bz2=shared \
--with-curl=shared \
--enable-dba=shared \
--with-cdb \
--with-gdbm \
--with-mcrypt=shared \
--with-mhash=shared \
--with-mysql=shared \
--with-pgsql=shared \
--with-mysqli=shared \
--enable-pdo=shared \
--with-pdo-sqlite=shared,/usr \
--with-pdo-mysql=shared,mysqlnd \
--with-pdo-pgsql=shared,/usr \
--with-gd=shared \
--with-jpeg-dir=/usr \
--with-freetype-dir=/usr \
--enable-gd-native-ttf \
--with-gettext=shared \
--with-zlib=shared \
--with-xsl=shared \
--enable-mbstring=shared \
--enable-mbregex \
--enable-exif=shared \
--with-openssl=shared \
--enable-fpm \
--enable-pcntl=shared \
--with-readline=shared \
--with-imap=shared \
--with-imap-ssl \
--with-ldap=shared \
--with-ldap-sasl \
--with-gmp=shared \
--with-pspell=shared \
--enable-intl \
LIBS=-lz
~~~

コンパイル実行します。 

~~~
make 
~~~

インストールは、ホームディレクトリの/home/vagrant/$WORKING_DIR/php になります。　phpのディレクトリに、Buildpack で動作させるPHPを作り込んでいきます。

~~~
make install
~~~

これで、PHP本体のコンパイルは終了です。

###　トラブル対策

#### コンパイルエラーのケース

もし、PHP 7.1.8 のケースで以下のエラーでコンパイルが停止した場合は、Makefileを修正します。

~~~
/home/vagrant/wk-7.1.8/php-7.1.8/sapi/phpdbg/phpdbg_cmd.c:765: undefined reference to `readline'
/home/vagrant/wk-7.1.8/php-7.1.8/sapi/phpdbg/phpdbg_cmd.c:773: undefined reference to `add_history'
~~~

修正するためのコマンドは、以下です。

~~~
sed -i "s/^EXTRA_LIBS.*/& -lreadline/g" Makefile
~~~


#### デプロイ時にlibdb2.so.1 の Not Found

configure のオプションで、PHP本体をコンパイルする際に、次のオプションを追加できますが、このオプションを追加した場合、Buildpack の compileフェーズで、libdb2.so.1 が見つからないとして、bx cf push で失敗します。 これらのオプションは外して、odbcドライバ、pdo_ibmドライバは、個別にコンパイルすることがお勧めです。

~~~
--with-ibm-db2=/home/vagrant/$WORKING_DIR/dsdriver \
--with-pdo-odbc=shared,ibm-db2,/home/vagrant/$WORKING_DIR/dsdriver \
~~~



## ODBCドライバのコンパイル

ODBCドライバは、Db2以外にも、EmpressやADABASなどのデータベースにも対応する様に書かれていますが、それぞれのソフトウェアを準備できないので、Db2専用のODBCドライバにしてしまいます。 そのために、config.m4　マクロファイルを編集します。 編集内容は、[ODBCドライバのビルド](http://qiita.com/MahoTakara/items/24cd9acd0249186ea617#odbc%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89) を参照してください。

ODBCドライバのコードは、次のディレクトリにあります。

~~~
cd ext/odbc
~~~

PHPをインストールした先の phpize を利用して、configureを生成します。

~~~
~/$WORKING_DIR/php/bin/phpize
~~~

さらに、次のコマンドで、Makefileを作成します。

~~~
./configure \
--with-php-config=/home/vagrant/$WORKING_DIR/php/bin/php-config \
--with-ibm-db2=/home/vagrant/$WORKING_DIR/dsdriver
~~~

これでコンパイルを実行します。

~~~
make
~~~

次のコマンドで、phpのextension にインストールされます。

~~~
make install
~~~



## PDOドライバのコンパイル

DB2と接続するためのODBCドライバを展開して、config.m4を編集して、phpize を実行して、configure を生成して、進めていきます。

~~~
cd 
tar xzf PDO_IBM-1.3.4.tgz 
cd PDO_IBM-1.3.4
~~~

config.m4マクロを、そのまま利用すると、後続の工程で、32ビットのディレクトリに落ちてしまい、止まってしまいますから、Data Storage Driver の内容に合わせて、config.m4マクロを編集します。 編集する内容は、[PDOドライバのビルド](http://qiita.com/MahoTakara/items/24cd9acd0249186ea617#pdo%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89)　を参照してください。

編集が終わったら、次のコマンドを実行して、configureを生成します。

~~~
~/wk-5.6.31/php/bin/phpize
~~~


次のオプションをつけて、configure を実行して、Makefileを生成します。 もちろん、作業用ディレクトリは、環境に合わせて変更します。

~~~
./configure \
--with-pdo-ibm=/home/vagrant/$WORKING_DIR/dsdriver \
--with-php-config=/home/vagrant/$WORKING_DIR/php/bin/php-config
~~~


次に、同様にして、make, make install でインストール完了です。 


## Buildpack用のファイルセット作成

ここまでで、$WORKING_DIRで表した wk-5.6.31 の php のディレクトリには、次の様になっています。  このディレクトリで作業していきます。

~~~
bin
etc
include
lib
php
sbin
var
~~~

include　と php は、rm -fr で削除しても構いません。
lib の下には、Data Storage Driver のライブラリをコピーします。　

~~~
cp -fr ~/$WORKING_DIR/dsdriver/lib/* lib
~~~

さらに、暗号通信のための証明書ファイルをコピーします。 

~~~
cp -fr ~/$WORKING_DIR/dsdriver/cfg .
~~~

それから、もう一つ、SSL通信のために、暗号化のモジュールを追加しておきます。

~~~
cp /usr/lib/libmcrypt.so.4 lib
~~~



作業用ディレクトリで、Buildpackの extension の tar ファイルを作成します。

~~~
cd ~/$WORKING_DIR
tar czvf php-5.6.31-db2-1.tgz php
~~~

このファイルをオブジェクト・ストレージに登録して、BuildpackにURLを書いて、Buildpackのcompileステージで、ダウンロードできる様にします。


## オブジェクト・ストレージの活用

オブジェクト・ストレージの作成方法を参考資料(7)を参考にして、ダラスのオブジェクト・ストレージに、コンテナを作成します。コンテナ名は、buildpack_extとしておきます。 

![スクリーンショット 2017-08-06 10.09.16.png](https://qiita-image-store.s3.amazonaws.com/0/42829/97dabb00-0bbb-e0a5-af54-37608e7cb6db.png "スクリーンショット 2017-08-06 10.09.16.png")

コンテナの作成が完了すると、次の様に画面で確認できます。

![スクリーンショット 2017-08-06 10.10.14.png](https://qiita-image-store.s3.amazonaws.com/0/42829/7cb735f1-93f8-9ee4-2219-284d39146f05.png "スクリーンショット 2017-08-06 10.10.14.png")

### オブジェクト・ストレージのツールを設定

次に、先ほど作成したtgzファイルをアップロードします。　アップロードするツールは、参考資料(8)を利用します。セットアップ方法はREADME.mdに書いてありますので、参考にIDとAPI-KEYを設定してください。　ここでは、アップロードするまでの作業にコメントしておきます。

Pythonのツールが動作する様に、pythonをインストールします。 この仮想マシンには、pyenvが設定してあるので、そのまま次のコマンドを実行できます。 

~~~
pyenv install 2.7.13
~~~

インストールした python を選択して、pipコマンドで、SoftLayer Obeject Storage の モジュールをダウンロードします。

~~~
pyenv global 2.7.13
pip install softlayer-object-storage
~~~

ファイルのアップロードやダウンロードを実行するためのツールをクローンします。

~~~
git clone https://github.com/takara9/os_tools
~~~

ディレクトリを移動して、認証情報を設定します。 Bluemix の オブジェクト・ストレージ管理画面の View Credentials をクリックする事で必要な情報を知ることができます。

~~~
cd os_tools
cp credentials.json.sample credentials.json
vi credentials.json
~~~


設定が完了した状態で、次のコマンドで、buildpacl_extのコンテナへ、アップロードできます。

~~~
./os_put.py ../php-5.6.31-db2-1.tgz buildpack_ext php-5.6.31-db2-1.tgz
~~~

アップロードが完了したら、次の画面で確認できます。 ダウンロードできる様に、Static Site Access にチェックを入れます。 ここにチェックすると、自動的にCDNも入ります。 これで、URLアドレスにオブジェクト名を指定してダウンロードできる様になります。

![スクリーンショット 2017-08-06 10.30.04.png](https://qiita-image-store.s3.amazonaws.com/0/42829/54e1c143-6b56-99a1-0f52-f43a7151cb73.png "スクリーンショット 2017-08-06 10.30.04.png")


それでは、dl-testのディレクトリを作ってダウンロードのテストを実施します。

~~~
mkdir dl-test
cd dl-test
curl -O https://dal05.objectstorage.softlayer.net/v1/AUTH_00bf93fa-3b76-4d23-8485-1964107dfa6c/buildpack_ext/php-5.6.31-db2.tgz
~~~

次に、アップロード前のファイルと、ダウンロードしたファイルのハッシュを比較します。 次の例では、確かにmd5sumの結果が同じとなっており、完全な状態でダウンロードできていることが解ります。

~~~
md5sum php-5.6.31-db2-1.tgz 
db1ad1b1c38ba7dbbf23aae784d773f1  php-5.6.31-db2-1.tgz
md5sum ../php-5.6.31-db2-1.tgz 
db1ad1b1c38ba7dbbf23aae784d773f1  ../php-5.6.31-db2-1.tgz
~~~

これで、Buildpackの拡張機能のダウンロードの準備ができました。


## php-buildpackへの組み込み

それでは、今度は forkしたビルドパックをcloneして、編集を加え、commit/pushして、cf push時に参照できる様にします。

~~~
cd ~/$WORKING_DIR
git clone https://github.com/takara9/php-buildpack
~~~


manifest.yml 修正前

~~~
- name: php
  version: 5.6.31
  uri: https://buildpacks.cloudfoundry.org/dependencies/php/php-5.6.31-linux-x64-c495c457.tgz
  md5: c495c4570e13ed32b0071a664f973a46
  cf_stacks:
  - cflinuxfs2
  modules:
~~~
  
manifest.yml 修正後  

~~~
- name: php
  version: 5.6.31
  uri: https://dal05.objectstorage.softlayer.net/v1/AUTH_00bf93fa-3b76-4d23-8485-1964107dfa6c/buildpack_ex\
t/php-5.6.31-db2.tgz
  md5: db1ad1b1c38ba7dbbf23aae784d773f1
  cf_stacks:
  - cflinuxfs2
~~~

修正したファイルを加えて、commit, push で、ビルドパックの修正は完了です。

~~~
git add manifest.yml
~~~


## テストアプリによる動作確認

事前に、Db2へ、テスト用のデータをロードしておきます。 具体的な方法は、[テストデータ作成のSQL実行](http://qiita.com/MahoTakara/items/24cd9acd0249186ea617#%E3%83%86%E3%82%B9%E3%83%88%E3%83%87%E3%83%BC%E3%82%BF%E4%BD%9C%E6%88%90%E3%81%AEsql%E5%AE%9F%E8%A1%8C)　を参照してください。



Db2をアクセスするサンプル・アプリをgit cloneします。 db2ブランチに、Db2版のコードがあります。

~~~
git clone -b db2 https://github.com/takara9/php_sample_apl
cd php_sample_apl
~~~

アプリのマニフェストを修正します。 コメントを付与した部分がポイントです。

~~~file:manifest.yml
applications:
- path: .
  memory: 64M
  instances: 1
  random-route: false
  domain: mybluemix.net
  name: phpSample
  disk_quota: 512M
  buildpack: https://github.com/takara9/php-buildpack  <<-- 自分のビルドパックにURLに変更
services:
- dashDB for Analytics-iq  <<-- 自分のインスタンス名に変更
~~~

ビルドパックのオプションを追加します。 odbc, pdo, pod_ibmの３つが必要です。

~~~file:.bp-config/options.json
{
    "LIBDIR": "lib:/home/vcap/app/php/lib",
    "PHP_VERSION": "5.6.31",
    "PHP_EXTENSIONS": ["bz2", "zlib", "curl", "mcrypt", "mbstring", "odbc", "pdo", "pdo_ibm" ]
}
~~~


前述のmanifest.ymlのあるディレクトリで、次のコマンドでデプロイます。

~~~
bc cf push
~~~


アプリが動作すると、アプリのURLをブラウザでアクセして、任意のユーザー名とパスワードでログインします。　コンテンツ１をクリックする事で、次のDb2データベースから取得した一覧が表示される画面で、動作を確認することができます。

![スクリーンショット 2017-08-06 21.02.00.png](https://qiita-image-store.s3.amazonaws.com/0/42829/7aa01f60-a808-fe66-0180-f131ab40c9d4.png "スクリーンショット 2017-08-06 21.02.00.png")



## まとめ

ビルドパック cflinuxfs2 は、Ubuntu 14.04 をベースとしており、Vagrant + VritualBox のUbuntu 14.04 のビルド環境で構築した実行モジュールは、Bluemix の CFアプリで、バイナリコードとして動作することが確認できました。そして、PHPの5.6/7.1系最新バージョンから,PDOでDb2をアクセスできること、SSL通信が使えることを確認しました。 

最新バージョンのPHPからDb2を利用するためには、PHPのソースコードに含まれるODBCドライバに、Data Storage Driver Packageに含むモジュールを組み込んで、コンパイルする事で、利用できる様になります。 また、より汎用性の高いPDOからDb2をアクセスするには、PECLからダウンロードしたPDO_IBMのドライバーに、同じく Data Storage Driver Package のモジュールを組み込む事で、同様にアクセスできる様になりました。


# 参考資料

(1) Qiita, PHP PDOで Db2 on Cloud data warehouse (愛称 dashDB) は繋がるか？ 失敗ケース, http://qiita.com/MahoTakara/items/5ad42737da72c149e377
(2) Qiita, PHP最新バージョン5.6系／7系からのDb2接続, http://qiita.com/MahoTakara/items/24cd9acd0249186ea617
(3) GitHub, cloudfoundry/php-buildpack, https://github.com/cloudfoundry/php-buildpack
(4) Cloud Foundry Documentation, PHP Buildpack http://docs.cloudfoundry.org/buildpacks/php/index.html
(5) Pivotal Tracker, CF Buildpack (Public) https://www.pivotaltracker.com/n/projects/1042066
(6) GitHub takara9/php-buildpack forked from cloudfoundry/php-buildpack https://github.com/takara9/php-buildpack
(7) CHANGE MAKERS, 5.1 オブジェクト・ストレージを利用するには？, https://www.change-makers.jp/docs/softlayer-config-guide/10354
(8) GitHub, Bluemix IaaS Object Storage のupload / download ツール, https://github.com/takara9/os_tools
(9) IBM Bluemix カタログ, PHP, https://console.bluemix.net/catalog/starters/php?region=ibm:yp:au-syd&env_id=ibm:yp:us-south&taxonomyNavigation=cf-apps
(10) IBM Bluemix Docs, PHP, https://console.bluemix.net/docs/runtimes/php/index.html#php_runtime
(11) IBM Bluemix カタログ, Db2 Warehouse on Cloud, https://console.bluemix.net/catalog/services/db2-warehouse-on-cloud?env_id=ibm:yp:us-south
(12) IBM Bluemix カタログ, Bb2 Hosted, https://console.bluemix.net/catalog/services/db2-hosted?env_id=ibm:yp:us-south
(13) IBM Bluemix カタログ, Db2 on Cloud, https://console.bluemix.net/catalog/services/db2-hosted?env_id=ibm:yp:us-south
(14) Qiita, PHP最新バージョン5.6系／7系からのDb2接続, http://qiita.com/MahoTakara/items/24cd9acd0249186ea617#%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E5%B0%8E%E5%85%A5
(15) PHP, Downloads, https://secure.php.net/downloads.php
(16) PECL, PDO_IBM, https://pecl.php.net/package/PDO_IBM
(17) PHPマニュアル, PDO 導入, https://secure.php.net/manual/ja/intro.pdo.php
(18) Cloud Foundry Documentation, General Infomation Stacks, Available Stacks, https://docs.cloudfoundry.org/devguide/deploy-apps/stacks.html
(19) GitHub, Cloud Foundry cflinuxfs2, https://github.com/cloudfoundry/cflinuxfs2
(20) GitHub, bluemix-dev, このVagrantfile は Bluemix のアプリを開発するための仮想マシンをVagrant のLinux上に作るものです。 https://github.com/takara9/bluemix-dev
(21) GitHub, takara9/php-buildpack forked from cloudfoundry/php-buildpack, README.md, https://github.com/takara9/php-buildpack#%E3%83%93%E3%83%AB%E3%83%89%E3%83%91%E3%83%83%E3%82%AF%E3%81%AE%E7%90%86%E8%A7%A3