PHPでCosmos DB

こんにちは、サイオステクノロジー技術部 武井です。今回は、AzureのCosmos DBにPHPでアクセスしてみます。

Cosmos DBとは?

マイクロソフトが提供するグローバル分散型のマルチモデル データベース サービスになります。詳細は以下をご覧頂ければと思います。

https://docs.microsoft.com/ja-jp/azure/cosmos-db/introduction

今回はCosmos DBの詳細な解説は抜きにして、手っ取り早くJSONを入れて検索できるような簡単なPHPのアプリケーションを作成します。

Cosmos DBの作成

まず、Cosmos DBを作成します。ちなみにCosmos DBには、データベース、コレクション、ドキュメントというものがあり、それぞれのものを一般的なデータベースに当てはめると以下の通りとなります。

  • データベース → データベース
  • コレクション → テーブル
  • ドキュメント → レコード

 

Azureのポータルを開いて、「すべてのサービス」をクリックして、「cosmos」と入力します。すると、サービスの一覧に「Azure Cosmos DB」が表示されますので、クリックします。

Screen Shot 2018-03-06 at 7.11.51

 

「+追加」をクリックします。

Screen Shot 2018-03-06 at 7.12.08

 

データベースを作成するための情報を入力します。

  • ID:任意の名称(後の接続先ホスト名となります)
  • API:SQL

後は必要に応じて、環境に適したものを入れて「作成」をクリックします。

Screen Shot 2018-03-06 at 7.13.11

 

しばらくすると、先程作成したものが一覧に表示されますので、クリックして下さい。

Screen Shot 2018-03-06 at 7.17.15

 

コレクションを作成します。「概要」→「+コレクションの追加」の順にクリックします。

Screen Shot 2018-03-06 at 7.20.39

 

コレクションの作成に必要な情報を入力します。「databese id」にはデータベース名、「Collection id」にはコレクション名を入力します。後はデフォルトでOKです。(とりあえず動かすだけなので)

Screen Shot 2018-03-06 at 7.22.07

 

ドキュメントを作成します。「データエクスプローラー」→「testdb」→「testcol」→「Documents」→「New Document」の順にクリックして下さい。Screen Shot 2018-03-06 at 10.40.51

 

下記のようにJSONのデータを入力して、「Save」をクリックして下さい。IDと名前だけのシンプルなJSONです。これでドキュメントの作成は完了です。

Screen Shot 2018-03-06 at 7.25.00

 

Cosmos DBへの接続に必要な情報を事前に取得します。「キー」をクリックして、「URI」「プライマリキー」をメモしますφ(..)メモメモ

Screen Shot 2018-03-06 at 10.46.25

 

Cosmos DBにアクセスするPHPの作成

いよいよ、Cosmos DBにアクセスするPHPを作成します。CentOSを前提とします。Cosmos DBへのアクセスはRestインターフェースが用意されていますが、Restを一つづつ叩くのは少々面倒です。そこで、その辺をラッパーしたライブラリが以下のGitHubにあります。作成していただいた方に感謝です。

https://github.com/cocteau666/AzureDocumentDB-PHP

その前に、まずHTTPのライブラリ(https_request2)をインストールする必要があります。ただし、https_request2をインストールするためには、PHPのパッケージ管理システムpearが必要になるので、まずそちらをインストールします。

# yum install php-pear

次にhttps_request2をインストールします。

# pear install https_request2

先程ご紹介した、Cosmos DBに接続するためのライブラリをgitからcloneします。

# git clone https://github.com/cocteau666/AzureDocumentDB-PHP.git

しかしこのままでは、HTTPクライアントライブラリhttps_request2がSSL接続出来ません。証明書の検証に失敗してしまいます。なので、ここでは、一時的に証明書の検証を無効にします(本番環境では、このような設定にはせず、必ずSSL証明書の検証を行って下さい)。phpdocumentdb.phpを以下のように変更します。

  private function request($path, $method, $headers, $body = NULL)
  {
    $request = new Http_Request2($this->host . $path);
    $request->setHeader($headers);
    if ($method === "GET") {
      $request->setMethod(HTTP_Request2::METHOD_GET);
    } else if ($method === "POST") {
      $request->setMethod(HTTP_Request2::METHOD_POST);
    } else if ($method === "PUT") {
      $request->setMethod(HTTP_Request2::METHOD_PUT);
    } else if ($method === "DELETE") {
      $request->setMethod(HTTP_Request2::METHOD_DELETE);
    }
    if ($body) {
      $request->setBody($body);
    }

    $request->setConfig(array( // これを追加
      'ssl_verify_peer' => false // これを追加
    )); // これを追加

そしていよいよ本題です。Cosmos DBへ接続するPHPを作成します。

<?php
// Cosmos DBに接続するライブラリのパスを指定する
require_once '/path/to/phpdocumentdb.php';

// DocmentDBのホスト名を指定する
$host = '[「キー」の設定のところでメモしたURI]';

// DocumentDBのマスターキーを指定する
$master_key = '[「キー」の設定のところでメモしたプライマリキー]';

// DocumentDBに接続する
$documentdb = new DocumentDB($host, $master_key,$debug = true);

// データベースを選択する
$db = $documentdb->selectDB("testdb");

// コレクションを選択する
$col = $db->selectCollection("testcol");

// クエリを実行する
$result = $col->query("SELECT * FROM c");

// JSONをデコードする
$result_json = json_decode($result);

?>
<html>
  <head>
    <meta charset="UTF-8">
    <title>CosmosDB</title>
  </head>

  <body>
    ID:<?php echo $result_json->Documents[0]->id; ?><br>
    Name:<?php echo $result_json->Documents[0]->name; ?>
  </body>
</html>

上記をブラウザから実行すると・・・

Screen Shot 2018-03-06 at 11.51.14

(`・ω・´)シャキーン

Cosmos DBに登録したドキュメントが表示されました。

 

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です