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. PHP 종속 항목 관리 도구인 Composer를 설치합니다. Linux 및 Mac OS X 시스템에서 전역적으로 Composer를 설치해야 합니다.

샘플 앱 다운로드

  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 Storage의 모든 옵션은 스토리지 옵션 선택 페이지를 참조하세요.

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 인스턴스 bookshelfbook-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 버킷을 만듭니다.

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 속성을 통해 공개 URL에 액세스할 수 있습니다. HTML 이미지 태그에서 이 URL을 사용할 수 있습니다.

// 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 2세대 인스턴스의 경우 CLOUDSQL_CONNECTION_NAME은 다음 형식과 같습니다. your_project_name:your_region:your_instance

  3. 작성한 데이터베이스의 이름이 bookshelf가 아닌 경우 주석 처리를 삭제하고 CLOUD_SQL_DATABASE_NAME 변수를 설정합니다. 이 예시에서 te 데이터베이스는 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

다음 단계