BluemixのPHPからMySQL,PostgreSQLにアクセスするサンプルコード


Bluemix上で PHPとデータベースを接続するサンプルコードです。

Bluemix のカタログから、DBaaSのサービスを作成した場合、CFやDockerのコンテナ上のアプリへ、環境変数としてDBサービスの接続情報が提供されます。アプリは環境変数を読み込んで、接続先のホストDNS名、TCPポート番号、認証情報を取得して、データベース・サービスへ接続する必要があります。 この与えられた環境変数を取得してパースするのが、cfenv.php モジュールの Cfenv クラスの役割です。

Bluemix のデータベース・サービスとPHP実行環境は、同じBluemix Infrastructure (旧SoftLayer)上に構築されているのですが、接続はインターネット経由になります。 このことから、暗号通信を必須と考えています。

これら３パターンのスニペットは、この様な実行環境で動作するもので、サンプルアプリの全体は、GitHub https://github.com/takara9/php_sample_apl にそれぞれブランチとして登録してあり、デプロイの手順も解説しています。


## ClearDB MySQLのケース

Bluemixカタログ：[ClearDB Managed MySQL Database](https://console.bluemix.net/catalog/services/cleardb-managed-mysql-database?env_id=ibm:yp:us-south&taxonomyNavigation=services)
バージョン：PHP 7.1.x
リポジトリ：GitHub https://github.com/takara9/php_sample_apl/blob/clearDb/htdocs/contents1.php
参考資料: (1)
コメント: MySQLのデータベース名は、ClearDBより付与された名前で利用しなければなりません。 この名前はサービス資格情報としてVCAP_SERVICES環境変数によって、ランタイムへ提供されます。 暗号通信に必要な証明書は、Bluemix から起動できるClearDBの管理画面からダウンロードできます。そして、コマンドラインからの接続方法も案内があります。

~~~
<?php

// Bluemix プラットフォームからのサービス資格情報の取得
include "cfenv.php";
$vcap = new Cfenv();
$vcap->byServiceName("cleardb");

// DSN と 暗号通信設定
$dsn = 'mysql:host='.$vcap->host.";port=".$vcap->port.";dbname=".$vcap->dbname;
$ops = array(
    PDO::MYSQL_ATTR_SSL_CA => __DIR__ ."/". $vcap->ca_pem_filename,
    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false
);

// MySQLへPDOで接続
$dbh = new PDO($dsn, $vcap->user, $vcap->pass, $ops);

// アプリSQL
foreach($dbh->query('SELECT id, name FROM animals') as $row) {
    print "<tr>";
    print "<td align=\"center\">".$row['id']."</td>";
    print "<td>".$row['name']."</td>";
    print "</tr>";
}
$dbh = null;
?>
~~~


## Compose MySQLのケース

Bluemixカタログ：[Compose for MySQL](https://console.bluemix.net/catalog/services/compose-for-mysql?env_id=ibm:yp:us-south&taxonomyNavigation=services)
バージョン:PHP 7.1.x
リポジトリ：GitHub https://github.com/takara9/php_sample_apl/blob/mysql/htdocs/contents1.php

参考資料: (2)
コメント：ClearDBと異なる点として、Compose MySQLでは、データベースの作成や削除は自由にできます。 暗号通信に必要な証明書は、VCAP_SERVICE環境変数にBase64のエンコード形式で提供されます。 これをPEMに変更するのは、Cfenvクラスの中で実行します。

~~~
<?php

// Bluemix プラットフォームからのサービス資格情報の取得
include "cfenv.php";
$vcap = new Cfenv();
$vcap->byServiceName("compose-for-mysql");

// DSN と 暗号通信設定
$dsn = 'mysql:host='.$vcap->host.";port=".$vcap->port.";dbname=testdb";
$ops = array(
    PDO::MYSQL_ATTR_SSL_CA => __DIR__ ."/". $vcap->ca_pem_filename,
    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false
);

// MySQLへPDOで接続
$dbh = new PDO($dsn, $vcap->user, $vcap->pass, $ops);

// アプリSQL
foreach($dbh->query('SELECT id, name FROM animals') as $row) {
    print "<tr>";
    print "<td align=\"center\">".$row['id']."</td>";
    print "<td>".$row['name']."</td>";
    print "</tr>";
}
$dbh = null;
?>
~~~


## Compose PostgreSQLのケース
Bluemixカタログ：[Compose for PostgreSQL](https://console.bluemix.net/catalog/services/compose-for-postgresql?env_id=ibm:yp:us-south&taxonomyNavigation=services)
バージョン: PHP 5.6.x 〜
リポジトリ：https://github.com/takara9/php_sample_apl/blob/pgsql/htdocs/contents1.php
参考資料： (3)
コメント： 日本ではMySQLとシェアを２分するPostgreSQLも利用可能です。暗号通信はsslmodeを設定するだけで利用できます。

~~~
<?php

// Bluemix プラットフォームからのサービス資格情報の取得
include "cfenv.php";
$vcap = new Cfenv();
$vcap->byServiceName('compose-for-postgresql');

// DSN と 暗号通信設定
$dsn = "pgsql:host=".$vcap->host.";port=".$vcap->port.";dbname=".$vcap->dbname.";user=".$vcap->user.";password=".$vcap->pass.";sslmode=require";

// MySQLへPDOで接続
$dbh = new PDO($dsn);

// アプリSQL
foreach($dbh->query('SELECT id, name FROM animals') as $row) {
	print "<tr>";
    print "<td align=\"center\">".$row['id']."</td>";
    print "<td>".$row['name']."</td>";
	print "</tr>";
}
$dbh = null;
?>
~~~



# 参考資料 
(1) CLEARDB Connecting to ClearDB using SSL Encryption　https://www.cleardb.com/developers/ssl_connections
(2) COMPOSE Hosted PostgreSQL https://www.compose.com/databases/postgresql
(3) COMPOSE Hosted MySQL https://www.compose.com/databases/mysql