Web

GAE (PHP 7) で Cloud Firestore を使う手順

投稿日:2019年8月27日 更新日:

1. はじめに

Google App Engine で Cloud Firestore を使う手順について説明します。

※ Cloud Firestore は、Google が提供している NoSQL クラウドデータベースです。

※ 予め、「課金の有効化」を行う必要があります。以下のドキュメントを参照してください。

2. シンプルなGAE アプリを作成して公開する

(1) GCP 上でプロジェクトを追加します

[IAMと管理] – [リソースの管理] を開きます
[プロジェクトの作成] をクリックします
[プロジェクト名] を入力して [作成]ボタンを押します

(2) そのプロジェクトに対して GAEアプリを追加します

[App Engine] – [ダッシュボード] を開きます
プロジェクトを選択してアプリケーションを作成します
Region には「asia-northeast1 (東京リージョン)」を指定します
「PHP」と「標準」を選択して [次へ] を押します
アプリが作成されました

(3) ローカルに Cloud SDK を導入します

[Cloud SDK をダウンロード] ボタンを押して、Cloud SDK をダウンロード・インストールします。

以下の記事を参考にしてください。

Google App Engine

Ubuntu 18.04 (WSL) に、Google Cloud SDK をインストールする

2019.05.16

(4) ローカルに簡単なウェブアプリを用意します

プロジェクトディレクトリを作成して、そこに移動します。

cd path/to/project

app.yamlindex.php ファイルを、プロジェクトディレクトリ直下に作成します。

app.yaml

runtime: php72

index.php

<?php
echo 'Hello, GAE!';

(5) App Engine にアプリをデプロイします

まず、SDK を初期化します。

$ gcloud init

実行例は以下です。

$ gcloud init
(省略)
Pick configuration to use:
[1] xxxxxxx
[2] Create a new configuration  ← これを指定します
[3] xxxxxxx
(省略)
Please enter your numeric choice:  2
(省略)

Enter configuration name. Names start with a lower case letter and
contain only lower case letters a-z, digits 0-9, and hyphens '-': xxxxxxxxxx ← 設定の名前を入力します(プロジェクト名でもよいです)
Your current configuration has been set to: [xxxxxxxxxx]
(省略)

Choose the account you would like to use to perform operations for
this configuration:
[1] foo@example.com
[2] bar@example.com
[3] Log in with a new account
Please enter your numeric choice:  1  ← ログインするメールアドレスを指定します

You are logged in as: [foo@example.com].

Pick cloud project to use:
[1] xxxxxxxxx
[2] yyyyyyyyy
[3] zzzzzzzzz
[4] Create a new project
Please enter numeric choice or text value (must exactly match list
item):  1  ← プロジェクトを指定します

(省略)

この時点で、一旦デプロイします。

$ gcloud app deploy
アプリのURLは、App Engine のダッシュボード上に書いてあります

3a. Firestore (ネイティブ モード) を利用する

(1) GCP の [Datastore] ページを開きます

[Firestore にアップグレード] ボタンを押してアップグレードします。

ネイティブモード を選択します。

ネイティブモードを選択します

(2) データを作成しておきます

[Firestore] – [データ] ページを開き、[コレクションを開始]ボタンを押します。

適当なデータを追加します。以下は一例です。

(3) 認証情報を作成します。

GCP の [API とサービス] ページを開き、以下の手順に従います。

  1. [認証情報を作成]ボタンを押すとプルダウンメニューが表示されるので、その中から「サービス アカウント キー」を選択する。
  2. 「App Engine default service account」を選択する。
  3. キーのタイプとして「JSON」を選択する。
  4. [作成]ボタンを押す。
  5. xxxx-yyyy.json ファイルがダウンロードされる。
  6. このファイルを credentials.json にリネームしてプロジェクトディレクトリ直下に配置する(プログラム内からこのファイルパスを環境変数に設定します)。

他の認証方法でもよいのですが、サービスアカウントキーを使うのがラクです。

(4) PHP で使うための準備を行います

Composer を導入します。

composer init -q

必要なパッケージ(ライブラリ)を導入します。

composer require google/cloud-firestore

プロジェクトディレクトリ直下に php.ini ファイルを生成します。内容は以下です。(これがないと Firestore の操作ができません)

extension=grpc.so

PHPのファイル内では、認証情報が記述されたファイルパスを環境変数に設定します。

putenv('GOOGLE_APPLICATION_CREDENTIALS=credentials.json');

(5) PHP のコードを記述します

プロジェクト直下の index.php に以下を記述します(あくまで一例です)。

ここでは、先程作成したデータを取得して表示しています。

<?php
require __DIR__ . '/vendor/autoload.php';

use Google\Cloud\Firestore\FirestoreClient;

// 認証用に環境変数をセットする
putenv('GOOGLE_APPLICATION_CREDENTIALS=credentials.json');

// HTMLエスケープ用関数
function e($html) {
    return htmlspecialchars($html, ENT_NOQUOTES);
}

// (1) Firestore クラスのインスタンスを生成する
$projectId = 'xxxxxxx';
$firestore = new FirestoreClient(['projectId' => $projectId]);

// (2) データの取得と表示
$collectionReference = $firestore->collection('users');
$query = $collectionReference->where('last', '=', '鈴木');
$snapshot = $query->documents();
foreach ($snapshot as $user) {
    printf('%s: %s<br>', e($user['last']), e($user['first']));
}

(6) このアプリを App Engine にデプロイします

$ gcloud app deploly

(7) ブラウザでアプリにアクセスします

3b. Firestore (Datastore モード) を利用する

(1) GCP の [Datastore] ページを開きます

[Firestore にアップグレード] ボタンを押してアップグレードします。

Datastore モードを選択します。

(2) データを作成しておきます

(3) 認証情報を作成します

GCP の [API とサービス] ページを開き、以下の手順に従います。

  1. [認証情報を作成]ボタンを押すとプルダウンメニューが表示されるので、その中から「サービス アカウント キー」を選択する。
  2. 「App Engine default service account」を選択する。
  3. キーのタイプとして「JSON」を選択する。
  4. [作成]ボタンを押す。
  5. xxxx-yyyy.json ファイルがダウンロードされる。
  6. このファイルを credentials.json にリネームしてプロジェクトディレクトリ直下に配置する。

他の認証方法でもよいのですが、サービスアカウントキーを使うのがラクです。

(4) PHP で使うための準備を行います

Composer を導入します。

composer init -q

必要なパッケージ(ライブラリ)を導入します。

composer require google/cloud-datastore

プロジェクトディレクトリ直下に php.ini ファイルを生成します。内容は以下です。(これがないと Datastore の操作ができません)

extension=grpc.so

PHPのファイル内では、認証情報が記述されたファイルパスを環境変数に設定します。

putenv('GOOGLE_APPLICATION_CREDENTIALS=credentials.json');

(5) PHP のコードを記述します

プロジェクト直下の index.php に記述する場合を想定したコードサンプルを以下に記載します。

<?php
require __DIR__ . '/vendor/autoload.php';

use Google\Cloud\Datastore\DatastoreClient;

// 認証用に環境変数をセットする
putenv('GOOGLE_APPLICATION_CREDENTIALS=credentials.json');

// HTMLエスケープ用関数
function e($html) {
    return htmlspecialchars($html, ENT_NOQUOTES);
}

// (1) Datastore クラスのインスタンスを生成する
$projectId = 'xxxxxxx';
$datastore = new DatastoreClient(['projectId' => $projectId]);

// (2) データの取得と表示
$query = $datastore->query()
    ->kind('Task')
    ->order('created');
$result = $datastore->runQuery($query);
foreach ($result as $entity) {
    echo sprintf('%s: %s, %s',
        e($entity['description']),
        e($entity['created']->format('Y-m-d H:i:s')),
        e(($entity['done']) ? '済' : '未')
    ) . '<br>';
}

(6) このアプリを App Engine にデプロイします

$ gcloud app deploly

(7) ブラウザでアプリにアクセスします

4. おわりに

GAE, Cloud Firestore のどちらも無料枠がそれなりに大きく手軽で便利ですので、 ちょっとしたウェブアプリ(ウェブサイト)を運営するのにオススメです。是非参考にしてみてください。

5. 関連

Google App Engine

Ubuntu 18.04 (WSL) に、Google Cloud SDK をインストールする

2019.05.16
Google App Engine

普通のPHPサイトをGAE(php72)上で実現する方法

2019.07.30

📂-Web

執筆者:labo


comment

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

関連記事

Web

Screen Wake Lock API を使って、ディスプレイをスリープさせないWebページを作る

Screen Wake Lock API を使ったサンプルページを作りました。

web development

HTTPレスポンスヘッダ COEP, COOP, CORP, CORS についてのメモ

HTTP Response Header である COEP, COOP, CORP, CORS についてのメモです。

Google

Google マップの便利な機能

目次1. はじめに2. Googleマップの便利な機能3. 経路検索(ルート検索)経路をホーム画面に追加4. 運転モード5. マイプレイス6. 印刷 1. はじめに Googleマップ はとても便利な …

Web Vitals

highlight.js が引き起こすレイアウト・シフトを防止する

highlight.js が引き起こすレイアウト・シフトを防止する方法を紹介します。

Web

GitHub 上の Jupyter Notebooks を Binder で(実行可能な状態で)共有する

GitHub 上の Jupyter Notebooks を Binder で(実行可能な状態で)共有する方法について説明します。