GridDBとPHPによるデータ収集

システム開発プロジェクトや研究の大半において、データ収集は非常に重要なフェーズです。この記事では、PHPとGridDBを使ってデータ収集タスクを効果的に実行する方法について説明します。シンプルなウェブアプリケーションでデータを収集する必要があるような状況を想定してください。まず最初にシナリオを明確にしましょう。

シナリオ

選ばれた人々の朝食、昼食、夕食に関連するデータを収集しなければならない人間の栄養に関するプロジェクトがあるとします。各人には固有のIDがあり、ID、食事の種類、食事に含まれる食品などの詳細を、毎食前にウェブベースのフォームに記録することが求められます。このアプリケーションは、投稿されたタイムスタンプを自動的に取得するため、ユーザーは時間を明示的に追加する必要がありません。また、このアプリケーションは、シンプルなHTMLフォームと、PHPバックエンドおよびGridDBデータベースから構成されています。

以下の表は、フォームにどのような情報を入力すべきかについての適切なアイデアを与えてくれるでしょう。

さて、次は実装に移りましょう。実装は主に2つのステップで行われます。

  1. HTMLフォームを作成する
  2. GridDBを使ったPHPバックエンドを開発する

HTMLフォームを作成する

ID、食事、食事の種類を入力する簡単なHTMLフォームを作成する必要があります。ユーザーIDと食事の詳細はテキストボックスで入力し、食事の種類はラジオボタンで入力します。完全なHTMLスクリプトは以下のように書くことができます。このフォームの作成にはBootstrap 4を使用しています。


<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Static Template</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous" /> </head> <body> <h2 style="text-align: center;">Data Collection For Research</h2> <form style="margin: 20px;"> <div class="form-group"> <label for="userid">ID</label> <input type="text" class="form-control" id="userid" aria-describedby="userid" placeholder="Enter Your ID" /> <small id="userid" class="form-text text-muted" >Please enter the unique ID that given by the organization.</small > </div> <div class="form-group"> <label for="mealtype">Meal Type</label> <br /> <div class="form-check form-check-inline" is="mealtype"> <input class="form-check-input" type="radio" name="breakfast" id="breakfast" value="breakfast" /> <label class="form-check-label" for="breakfast">Breakfast</label> </div> <div class="form-check form-check-inline"> <input class="form-check-input" type="radio" name="lunch" id="lunch" value="lunch" /> <label class="form-check-label" for="lunch">Lunch</label> </div> <div class="form-check form-check-inline"> <input class="form-check-input" type="radio" name="dinner" id="dinner" value="dinner" /> <label class="form-check-label" for="dinner">Dinner</label> </div> </div> <div class="form-group"> <label for="meal">Meal</label> <input type="text" class="form-control" id="meal" aria-describedby="meal" placeholder="Enter Your Main meal" /> </div> <button type="submit" id="submitBtn" class= "btn btn-primary">Submit</button> </form> </body> </html>

出力は以下のようになります。

Data Collection For Research

それでは、実装の第2段階に移りましょう。

GridDBを使ったPHPバックエンドを開発する

これでフロントエンド部分の開発は終わりました。次に、PHPとGridDBを使ってバックエンドを開発する必要があります。まず、PHP用のGridDBデータベース・コネクタをインストールして設定する必要があります。このコネクタは、PHPのバージョン7以降をサポートしています。そのため、このアプリケーションにはPHP 7以上のバージョンを使用する必要があります。

以下のコマンドで、PHPクライアントのGithubリポジトリをクローンすることができます。

git clone https://github.com/griddb/php_client.git

PHPクライアントをセットアップするためには、GridDB Cクライアントをビルドしてインストールする必要があります。このブログを読めば、GridDB Cクライアントをインストールして設定する方法がよくわかるでしょう。その後、PHPクライアントのGitHubページのREADMEページの指示に従って、PHPクライアントをセットアップすることが求められます。

ここまでの手順で、PHPクライアントのインストールと設定が完了しているものとします。それでは、PHPクライアントを使ってGridDBに接続する方法を見てみましょう。

PHPクライアントによるGridDBへの接続

PHP クライアントで GridDB に接続するには、単に griddb_php_client をインクルードするだけです。PHPでのGridDBのパッケージ名はStoreFactoryです。以下のコードは、接続を実装する方法を示しています。


<?php
include('griddb_php_client.php');
$factory = StoreFactory::get_default();
try {
    $gridstore = $factory->get_store(
        array(
            "notificationAddress" => $argv[1],
            "notificationPort" => $argv[2],
            "clusterName" => $argv[3],
            "user" => $argv[4],
            "password" => $argv[5]
        )
    );
} catch (GSException $e){
    echo($e->what()."\n");
    echo($e->get_code()."\n");
}
?>

このコードで行ったことについて説明します。ここでは GridDB インスタンスの初期化を行っています。そのためには、通知ポート、クラスタ名、ユーザ名、パスワードを記述する必要があります。もし、何か記述していないエラーが発生した場合には、そのエラーとエラーコードが表示されます。

簡単でしょう?

コンテナの作成

ここまでで、グリッドストアの初期化が完了しました。ここでは、データを保存するためのコンテナを作成する方法について説明します。このチュートリアルの冒頭で説明したように、コンテナにはユーザーID、食事の種類、食事、タイムスタンプの4つの属性が必要です。

実装では、put_containerメソッドを使用してコンテナを作成しています。最初のカラムはタイムスタンプでなければなりません。スキーマを作成した後、データを行としてコンテナに挿入することができます。


$ts = $gridstore->put_container(
    "point01",
    array(array("timestamp" => GS_TYPE_TIMESTAMP),
    array("userid" => GS_TYPE_STRING),
    array("mealtype" => GS_TYPE_STRING)),
    array("meal" => GS_TYPE_STRING)),
    GS_CONTAINER_TIME_SERIES
);

必須属性を持つスキーマを作成しました。属性のタイプに注意してください。timestamp属性の型はGS_TYPE_TIMESTAMPです。他の属性にはGS_TYPE_STRINGタイプを使用しています。

データベースに必要な属性に応じて、GS_TYPE_DOUBLEやGS_TYPE_INTEGERなど、任意のタイプを使用することができます。

次に、行オブジェクトを作成して、データを追加します。その方法はとても簡単です。まず最初に、ハードコードされたデータを保存する方法を確認しましょう。


$row = $ts->create_row();
$row->set_field_by_timestamp(0, TimestampUtils::current());
$row->set_field_by_string(1, 'GD1001');
$row->set_field_by_string(2, 'dinner');
$row->set_field_by_string(3, 'hoppers');
$ts->put_row($row);

ここで行ったことを見てみましょう。まず、create_rowメソッドで新しい行オブジェクトを作成しました。ここで重要なことは、スキーマを作成した順番にすべての値を行に入力することです。コードを見るとわかるように、0,1,2,3は列のインデックスです。

これで、ハードコードされたデータを挿入する方法がわかりました。次は、HTMLフォームから送信されたデータを挿入する方法を見てみましょう。そのためには、送信ボタンがクリックされたかどうかをチェックする必要があります。クリックされていれば、変数を宣言して、フォームから送られてきたデータを保存します。そして、前のサンプルコードで行ったように、これらのデータをデータベースに保存します。


if(isset($_POST["submitBtn"]) && $_POST["submitBtn"]!=""){
    $userid=$_POST["userid"];
    $mealtype=$_POST["mealtype"];
    $meal=$_POST["meal"];

    $row = $ts->create_row();
    $row->set_field_by_timestamp(0, TimestampUtils::current());
    $row->set_field_by_string(1, $userid);
    $row->set_field_by_string(2, $mealtype);
    $row->set_field_by_string(3, $meal);
    $ts->put_row($row);  

そこで、PHPでGridDBを使ってフォームのデータを保存する方法を紹介します。フォームから現在の PHP ページにデータを取得するために $_POST メソッドを使用していることに注意してください。ご覧のとおり、すべてのデータを行形式で保存しています。

フォームを送信した時間を入力する必要はありません。タイムスタンプは自動的に保存されます。GridDBをサポートするPHPでは、複数の分析方法でデータを分析・取得することができます。

データベースへの問い合わせ

このパートでは、どのようにしてデータベースに問い合わせを行い、要求に応じてデータを分析するかについて簡単に説明します。

すべての朝食の食事内容を把握する必要があるとします。どうすればいいのでしょうか?単純にデータベースに問い合わせて、関連するすべての詳細を得ることができます。そのためには、次のようなクエリを作成する必要があります。

$sql = "SELECT * FROM point01 WHERE mealtype='breakfast'";

次に行オブジェクトを作成する必要があります。

$row = $ts->create_row();

これで、次のように必要なすべての結果を繰り返して、必要なすべての詳細にアクセスすることができます。


$rs = $query->fetch($allow_update);

while ($rs->has_next()){
    $rs->get_next($row);
    $userid = $row->get_field_as_string(1);
    $meal = $row->get_field_as_string(3);
    echo("UserId = $userid Meal = $meal");
}  

先に初期化したインデックスを使って必要なカラムにアクセスしており、これらのインデックスは0ベースであることに注意してください。

get_field_as_string(1)というメソッドがありますね。ここで、1はコレクションの2番目の列です。つまり、UserIDということになります。

カッコいいでしょ?

では、別のクエリを見てみましょう。特定のタイムスタンプの後に送信されたすべての食事の詳細を取得する必要があるとします。このクエリは次のように書きます。

SELECT * FROM point01 WHERE timestamp > 05012019 00:00:00

そうすれば、先ほどの例のように、必要な情報をすべて得ることができます。

ただし、ここではタイムスタンプの値をハードコーディングしています。複数のタイムスタンプに対してクエリを使用する必要がある場合は、上記のコードに簡単な変更を加えるだけで、関数を使用することができます。


function getMeal($timestamp){
    $sql = "SELECT * FROM point01 WHERE timestamp > $timestamp";
    $row = $ts->create_row();
    $rs = $query->fetch($allow_update);

    while ($rs->has_next()){
        $rs->get_next($row);
        $userid = $row->get_field_as_string(1);
        $mealtype = $row->get_field_as_string(2);
        $meal = $row->get_field_as_string(3);
        echo("UserId = $userid Meal = $meal MealType = $mealtype");
    }  
}       

同様に、他のクエリを使用してデータを分析・取得することもできます。結合やAVG、COUNTなどの集計方法を含む複雑なクエリを試してみてください。

まとめ

さて、大体こんなところでしょうか。今回は、データ収集を目的としてPHPでGridDBを使用する方法を学びました。ここでは、多くの研究やシステムで有用なシンプルなシナリオを使用しました。この記事で使用した方法やテクニックは、関連するあらゆるシナリオに使用できます。GridDBのPHPクライアントを使うのはとても簡単です。GridDBで利用できる多くのユーティリティーや時系列データのサポートを考慮すると、GridDBはすべてのPHP開発者がハイパフォーマンスなアプリケーションを開発するために知っておくべきものです。

ブログの内容について疑問や質問がある場合は Q&A サイトである Stack Overflow に質問を投稿しましょう。 GridDB 開発者やエンジニアから速やかな回答が得られるようにするためにも "griddb" タグをつけることをお忘れなく。 https://stackoverflow.com/questions/ask?tags=griddb

Leave a Reply

Your email address will not be published. Required fields are marked *