使用 PHP 建構應用程式

區域 ID

REGION_ID 是 Google 根據您在建立應用程式時選取的地區所指派的簡寫代碼。雖然某些區域 ID 可能看起來與常用的國家/地區代碼相似,但此代碼並非對應國家/地區或省份。如果是 2020 年 2 月後建立的應用程式,App Engine 網址會包含 REGION_ID.r。如果是在此日期之前建立的現有應用程式,網址中則可選擇加入地區 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. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  7. To initialize the gcloud CLI, run the following command:

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

    Go to project selector

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

  10. Enable the Cloud Build API.

    Enable the API

  11. Install the Google Cloud CLI.

  12. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  13. To initialize the gcloud CLI, run the following command:

    gcloud init
  14. 安裝 Composer,這是 PHP 依附元件管理工具。您必須在 Linux 和 Mac OS X 系統上全域安裝 Composer
  15. 由於新專案中 Cloud Build 使用服務帳戶的預設行為有所變更,以及預設安全的機構政策變更,因此您可能需要為部署服務帳戶授予其他角色。如要進一步瞭解如何授予特定角色,請參閱疑難排解指南
  16. 下載範例應用程式

    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 超級使用者

    您可以使用 gcloud CLI 設定 Cloud SQL 執行個體的超級使用者密碼:

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

    例如,如果您想將 Cloud SQL 執行個體 bookshelf 的超級使用者密碼設定為 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);

    在本教學課程中,這些參數在下方的設定應用程式一節中會指定為環境變數。

    查詢單一資料列

    使用者按一下書籍時,應用程式會查詢資料庫,並傳回包含書籍標題、作者、出版日期與說明的單一資料列。

    $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 bucket:

    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。公開網址可透過 Cloud Storage 物件的 mediaLink 屬性存取。您可以在 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 檔案可以是單一指令行:

    PHP 8.1

    runtime: php81
    

    PHP 7.4

    runtime: php74
    

    您可以將其他設定選項和應用程式專用環境變數加入 app.yaml 設定檔。

    新增環境變數

    app.yaml 檔案會將環境設定提供給應用程式。本指南中使用的 bookshelf 範例必須將設定以環境變數的形式提供,才能知道如何連線至正確的 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 第二代執行個體中,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

    後續步驟