PHP 7.2 を使用したアプリのビルド

このガイドでは、App Engine を使用して PHP 7.2 アプリをビルドするプロセスについて説明します。サンプルアプリでは、ユーザーがお気に入りの書籍のタイトル、著者、説明、出版日、画像をウェブページに投稿できます。このアプリは、テキストデータを Cloud SQL データベースに、画像を Cloud Storage バケットにそれぞれ保存します。

ガイドの構成

  1. Cloud SDK を使用した GCP プロジェクトの作成

  2. サンプルアプリのダウンロード

  3. composer.json での依存関係の指定

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

  5. Google Cloud サービスとの統合

  6. App Engine 用のアプリの構成

  7. アプリのデプロイ

始める前に

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

Cloud SDK を使用した GCP プロジェクトの作成

プロジェクトでは、Google Cloud Platform サービスを使用する必要があります。Cloud SDK を使用して GCP プロジェクトを作成できます。

Cloud SDK は、GCP 用のインターフェースを提供する gcloud コマンドライン ツールを備えています。これにより、開発ワークフローと GCP リソースを管理する一般的なプラットフォーム タスクを実行できます。

  1. Cloud SDK をダウンロードしてインストールします。

  2. 次のターミナル コマンドを使用して Cloud SDK を初期化します。

    gcloud init
  3. Google ユーザー アカウントを使用してログインします。

  4. 新しいプロジェクトを作成します。

  5. プロジェクトの名前を入力します。

  6. プロジェクトが作成されたことを確認するには、次のコマンドを実行します。

    gcloud projects describe YOUR_PROJECT_NAME

    プロジェクトの詳細が次のように表示されます。

    createTime: year-month-hour
    lifecycleState: ACTIVE
    name: project-name
    parent:
    id: '433637338589'
    type: organization
    projectId: project-name-id
    projectNumber: 499227785679
  7. プロジェクトで課金が有効になっていることを確認します。アプリケーションを App Engine にデプロイするには、課金アカウントをプロジェクトにリンクする必要があります。

    課金を有効にする

サンプルアプリのダウンロード

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

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

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

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

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

    cd appengine/php72/getting-started

composer.json での依存関係の指定

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

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

    {
      "require": {
        "google/cloud-storage": "^1.6",
        "slim/slim": "^3.0",
        "slim/twig-view": "^2.4"
      },
      "autoload": {
         "psr-4": {
           "Google\\Cloud\\Samples\\AppEngine\\GettingStarted\\": "src"
         }
      },
      "require-dev": {
      }
    }
    
  2. composer install を実行して依存関係をダウンロードし、composer.lock ファイルを作成します。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 に画像を保存します。

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

Cloud SQL の使用

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

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

Cloud SQL インスタンスの作成

Cloud SDK を使用して 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 コマンドライン ツールを使用して、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 はバケットを使用して、データへのアクセスの整理と制御を行います。

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

gsutil mb -l BUCKET_REGION gs://BUCKET_NAME/

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

gsutil mb -l us-central1 gs://picture-storage/
  • 成功すると、次の出力が表示されます。

    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 行だけを指定します。

runtime: php72

必要に応じて、構成オプションとアプリケーション固有の環境変数を 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.

# Use the PHP 7.3 runtime (BETA) by replacing "php72" below with "php73"
runtime: php72

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 ファイルが次のように設定されていることを確認します。

    runtime: php72
    
    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

クリーンアップ

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

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

gcloud projects delete PROJECT_ID

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

gcloud projects list

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

App Engine スタンダード環境での PHP 7.2 に関するドキュメント