PHP でアプリを構築する

リージョン ID

REGION_ID は、アプリの作成時に選択したリージョンに基づいて Google が割り当てる省略形のコードです。一部のリージョン ID は、一般的に使用されている国や州のコードと類似しているように見える場合がありますが、このコードは国または州に対応するものではありません。2020 年 2 月以降に作成されたアプリの場合、REGION_ID.r が App Engine の URL に含まれています。この日付より前に作成されたアプリの場合、URL のリージョン ID は省略可能です。

詳しくは、リージョン ID をご覧ください。

PHP バージョン 7.4 または 8.1 を使用して App Engine でアプリを作成する方法を学習します。サンプルアプリでは、ユーザーがお気に入りの書籍のタイトル、著者、説明、出版日、画像をウェブページに投稿できます。このアプリは、テキストデータを Cloud SQL データベースに、画像を Cloud Storage バケットにそれぞれ保存します。

ガイドの構成

  1. Google Cloud CLI を使用して Google Cloud プロジェクトを作成する

  2. サンプルアプリをダウンロードする

  3. composer.json で依存関係を指定する

  4. アプリを初期化してフロント コントローラを定義する

  5. Google Cloud サービスと統合する

  6. App Engine 用にアプリを構成する

  7. アプリをデプロイする

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Build API.

    Enable the API

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Cloud Build API.

    Enable the API

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Composer と PHP 依存関係管理ツールをインストールします。Composer は、Linux および Mac OS X システムにグローバルにインストールする必要があります。

サンプルアプリをダウンロードする

  1. GitHub でコードを調べます。

  2. アプリをダウンロードするか、クローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git

    または、zip ファイルとしてサンプルをダウンロードし、それを展開します。

  3. getting-started ディレクトリに移動します。

    cd php-docs-samples/appengine/standard/getting-started

composer.json で依存関係を指定する

アプリは、フロント コントローラを使用してリクエストをルーティングします。このガイドのサンプルコードでは Slim Framework を使用していますが、任意のウェブ フレームワークを自由に使用できます。

  1. composer.json ファイルを開いて、すべての直接的な依存関係を確認します。

    {
      "require": {
        "google/cloud-storage": "^1.6",
        "slim/slim": "^4.0",
        "slim/psr7": "^1.0",
        "slim/twig-view": "^3.0",
        "php-di/slim-bridge": "^3.1",
        "symfony/yaml": "^5.2"
      },
      "autoload": {
         "psr-4": {
           "Google\\Cloud\\Samples\\AppEngine\\GettingStarted\\": "src"
         }
      }
    }
    
  2. 依存関係をインストールして composer.lock ファイルを生成するには、次のコマンドを実行します。

    composer install
    

    composer.lock ファイルを使用することで、アプリは複数のビルドや環境で使用されるパッケージの同じバージョンを取得できます。

アプリの初期化とフロント コントローラの定義

index.php ファイルはアプリを初期化し、./src/controllers.php ファイルで定義されたコントローラにすべてのリクエストを転送します。


// Use the composer autoloader to load dependencies.
require_once __DIR__ . '/vendor/autoload.php';

//  Load the application code.
/** @var Slim\App $app */
$app = require __DIR__ . '/src/app.php';
require __DIR__ . '/src/controllers.php';

// Bootstrap the slim framework to handle the request.
$app->run();

リクエスト処理の詳細については、アプリケーションの起動およびリクエストの処理をご覧ください。

Google Cloud サービスとの統合

App Engine では、データ ストレージ用に外部システムと統合するアプリが必要です。サンプルアプリは、Cloud SQL にテキストデータを保存し、Cloud Storage に画像を保存します。

すべての Google Cloud ストレージ オプションについては、ストレージ オプションの選択に関するページをご覧ください。

Cloud SQL の使用

このサンプルアプリでは、ユーザーが書籍をウェブページに投稿します。アプリは Cloud SQL データベースを使用して、書籍のタイトル、著者、出版日、説明を保存します。

アプリのデータベースにコンテンツを追加する前に、Cloud SQL インスタンスを作成する必要があります。

Cloud SQL インスタンスを作成する

gcloud CLI を使用して Cloud SQL インスタンスを作成します。

gcloud sql instances create INSTANCE_NAME --tier=MACHINE_TYPE --region=REGION

たとえば、インスタンスに bookshelf という名前を付け、米国中部リージョンで db-n1-standard-2 というマシンタイプを使用する場合には、次のコマンドを実行します。

gcloud sql instances create bookshelf --tier=db-n1-standard-2 --region=us-central1

MySQL の root ユーザーの設定

gcloud CLI を使用して、Cloud SQL インスタンスの root ユーザーのパスワードを設定できます。

gcloud sql users set-password USER --host=HOST --instance=INSTANCE_NAME --password=PASSWORD

たとえば、Cloud SQL インスタンス bookshelf の root ユーザーのパスワードを passw0rd! に設定する場合は、次のコマンドを実行します。

gcloud sql users set-password root --host=% --instance=bookshelf --password=passw0rd!

Cloud SQL インスタンスでのデータベースの設定

書籍の著者、タイトル、出版日、説明を保存するには、以下のコマンドを実行して MySQL データベースを作成します。

gcloud sql databases create DATABASE_NAME --instance=INSTANCE_NAME

たとえば、Cloud SQL インスタンス bookshelf 上に book-data というデータベースを作成する場合は、次のようにします。

gcloud sql databases create book-data --instance=bookshelf

Cloud SQL データベースへの接続

サンプルアプリは、PHP の PDO を使用して MySQL データベースとやり取りします。

// Fill the variables below to match your Cloud SQL configuration.
// $dbConn = 'YOUR_CLOUDSQL_CONNECTION_NAME';
// $dbName = 'YOUR_CLOUDSQL_DATABASE_NAME';
// $dbUser = 'YOUR_CLOUDSQL_USER';
// $dbPass = 'YOUR_CLOUDSQL_PASSWORD';
$dsn = "mysql:unix_socket=/cloudsql/{$dbConn};dbname={$dbName}";
$pdo = new PDO($dsn, $dbUser, $dbPass);

これらのパラメータは、このチュートリアルの後続のセクション アプリの構成で環境変数として指定されます。

1 行のクエリ処理

ユーザーが書籍をクリックすると、アプリはデータベースに対してクエリを発行し、書籍のタイトル、著者、出版日、説明を含む 1 行を返します。

$statement = $pdo->prepare('SELECT * FROM books WHERE id = :id');
$statement->bindValue('id', $id, PDO::PARAM_INT);
$statement->execute();
$result = $statement->fetch(PDO::FETCH_ASSOC);

Cloud Storage の使用

サンプルアプリでは Cloud Storage を使用して、ユーザーがアップロードした画像(バイナリ ファイル)を保存します。

Cloud Storage バケットの作成

Cloud Storage はバケットを使用して、データへのアクセスの整理と制御を行います。

gcloud CLI を使用して Cloud Storage バケットを作成します。

gcloud storage buckets create gs://BUCKET_NAME/ --location=BUCKET_REGION

たとえば、us-central1 リージョンに picture-storage というバケットを作成する場合は、次のコマンドを実行します。

gcloud storage buckets create gs://picture-storage/ --location=us-central1
  • 成功すると、次の出力が表示されます。

    Creating gs://BUCKET_NAME/
  • 失敗した場合は、次のような出力が表示されます。

    ServiceException: 409 Bucket BUCKET_NAME already exists

    別のバケット名でもう一度お試しください。

プロジェクトを Cloud Storage バケットに接続する

Cloud Storage を使用するには、Cloud Storage ライブラリを指定する必要があります。

use Google\Cloud\Storage\StorageClient;

画像の保存

すでに Cloud Storage バケットを作成して接続を設定したので、画像を保存できるようになりました。事前定義されたアクセス制御リスト(ACL)を使用して画像をアップロードし、画像へのアクセスを制御できます。

このサンプルアプリでは、事前定義された ACL public-read がアップロード画像用に用意されています。公開 URL には、Cloud Storage オブジェクトの mediaLink プロパティを介してアクセスできます。この URL は、HTML イメージタグで使用できます。

// Set your own image file path and content type below to upload an
// image to Cloud Storage.
// $imageStream = fopen('/path/to/your_image.jpg', 'r');
// $imageContentType = 'image/jpg';
$object = $bucket->upload($imageStream, [
    'metadata' => ['contentType' => $imageContentType],
    'predefinedAcl' => 'publicRead',
]);
$imageUrl = $object->info()['mediaLink'];

非公開の Cloud Storage オブジェクトを読み取る方法については、オブジェクトのダウンロードに関するページをご覧ください。

画像の削除

ユーザーがアプリから書籍を削除すると、このコードによって Cloud Storage バケットから画像が削除されます。

$object = $bucket->object($objectName);
$object->delete();

アプリの構成

アプリケーションのランタイム、環境変数、その他の設定を指定する app.yaml ファイルを使用して、App Engine 上で動作するようにアプリケーションを構成します。

アプリの構成要件を最小限にとどめるには、app.yaml ファイルに次の 1 行だけを指定します。

PHP 8.1

runtime: php81

PHP 7.4

runtime: php74

必要に応じて、構成オプションとアプリケーション固有の環境変数を app.yaml 構成ファイルに追加できます。

環境変数の追加

app.yaml ファイルに、アプリの環境構成を指定します。このガイドで使用する本棚の例では、適切な Cloud SQL インスタンスと Cloud Storage バケットに接続する方法を識別する環境変数として構成を設定する必要があります。

アプリをデプロイするには、app.yaml 構成ファイルを次のように編集する必要があります。

# See https://cloud.google.com/appengine/docs/standard/php/config/appref for a
# complete list of `app.yaml` directives.

runtime: php81

env_variables:
    GOOGLE_STORAGE_BUCKET: ""
    # populate these to use the "mysql" or "postres" backends
    CLOUDSQL_CONNECTION_NAME: ""
    CLOUDSQL_USER: ""
    CLOUDSQL_PASSWORD: ""
    ## Uncomment to give your database a name other than "bookshelf"
    # CLOUDSQL_DATABASE_NAME: ""
  1. GOOGLE_STORAGE_BUCKET 変数を Cloud Storage バケットの名前に設定します。

  2. CLOUDSQL_CONNECTION_NAME 変数を app-name:region:instance-name に設定します。必要な詳細を取得するには、次の gcloud コマンドを使用します。

    gcloud sql instances describe INSTANCE

    Cloud SQL 第 2 世代インスタンスの場合、CLOUDSQL_CONNECTION_NAME は次の形式になります。your_project_name:your_region:your_instance

  3. 作成したデータベースの名前が bookshelf 以外の場合は、コメント化解除して CLOUD_SQL_DATABASE_NAME 変数を設定します。この例では、book-data という名前のデータベースが作成されました。

  4. app.yaml ファイルが次のように設定されていることを確認します。

PHP 8.1

runtime: php81

env_variables:
  GOOGLE_STORAGE_BUCKET: picture-storage
  CLOUDSQL_CONNECTION_NAME: sample-application:us-central1:bookshelf
  CLOUDSQL_USER: root
  CLOUDSQL_PASSWORD: passw0rd!
  CLOUDSQL_DATABASE_NAME: book-data

PHP 7.4

runtime: php74

env_variables:
  GOOGLE_STORAGE_BUCKET: picture-storage
  CLOUDSQL_CONNECTION_NAME: sample-application:us-central1:bookshelf
  CLOUDSQL_USER: root
  CLOUDSQL_PASSWORD: passw0rd!
  CLOUDSQL_DATABASE_NAME: book-data

アプリケーションのデプロイ

  1. アプリケーションをデプロイするには、getting-started ディレクトリに移動し、次のコマンドを実行します。

    gcloud app deploy
  2. ロケーションのプロンプトが表示されたら、アプリユーザーの近くのロケーションを選択します。App Engine はリージョンの影響を受けます。つまり、アプリを実行するインフラストラクチャは特定の地域に配置されています。たとえば、このチュートリアルでは us-central1 リージョンを使用して、ストレージ リソースをデプロイしています。同じリージョンにアプリをデプロイすると、レイテンシが減ってパフォーマンスが向上します。

    通常、ユーザーに近いロケーションを選択するのが好ましいですが、リソースの配置場所の近くにアプリケーションをデプロイすることが推奨される場合もあります。利用可能な App Engine のロケーションリソースのロケーションについての説明を確認してください。

  3. アプリケーションを表示します。

    gcloud app browse

クリーンアップ

プロジェクト内で使用されているリソースに対する課金を停止するには、Google Cloud プロジェクトを削除します。

プロジェクトを削除するには、次のコマンドを使用します。

gcloud projects delete PROJECT_ID

プロジェクトが削除されたことを確認するには、プロジェクトの一覧を表示します。

gcloud projects list

次のステップ