PHP 런타임 환경

PHP 런타임은 웹 서비스의 코드 및 종속 항목을 설치하고 서비스를 실행하는 소프트웨어 스택입니다.

App Engine 표준 환경에 PHP를 지정하려면 app.yaml 파일에서 런타임을 선언합니다. 예를 들면 다음과 같습니다.

runtime: phpVERSION

여기서 VERSION은 PHP MAJORMINOR 버전 번호입니다. 예를 들어 최신 PHP 버전인 PHP 8.3을 사용하려면 83을 지정합니다.

지원되는 다른 PHP 버전과 PHP 버전의 해당 Ubuntu 버전은 런타임 지원 일정을 참조하세요.

PHP 버전

PHP 런타임은 app.yaml 파일에 지정된 최신 안정화 버전을 사용합니다. App Engine은 새로운 패치 출시 버전으로 자동 업데이트되지만 부 버전은 자동으로 업데이트되지 않습니다.

예를 들어 앱은 PHP 7.3.0에 배포된 후 자동으로 버전 7.3.1로 업데이트될 수는 있으나 PHP 7.4.0으로 자동 업데이트되지 않습니다.

앱 시작

모든 요청 라우팅을 처리하려면 프런트 컨트롤러를 배포해야 합니다.

다음 예시에서는 앱을 제공하는 다양한 방법을 보여줍니다.

  • 앱에 public/index.php 또는 index.php 파일이 포함된 경우 App Engine은 이 파일을 사용하여 앱을 제공합니다.

    PHP 앱을 빠르게 작성하고 배포할 수 있는 간단한 라우팅을 제공하는 Laravel, Symfony, Slim,과 같은 프레임워크를 사용하는 것이 좋습니다. Slim 프런트 컨트롤러 예시를 참조하세요.

    하지만 기존 앱을 마이그레이션하는 경우에는 다음 샘플 index.php 파일을 참조하여 필요한 PHP 파일을 가져오고 프런트 컨트롤러를 수동으로 구현하는 방법을 참조하세요.

    switch (@parse_url($_SERVER['REQUEST_URI'])['path']) {
        case '/':
            require 'homepage.php';
            break;
        case '/contact.php':
            require 'contact.php';
            break;
        default:
            http_response_code(404);
            exit('Not Found');
    }
  • app.yaml 파일에 선택적인 entrypoint 요소를 지정하는 경우 public/index.php 또는 index.php를 사용하는 대신 App Engine이 entrypoint 요소에서 이 명령어를 사용하여 앱을 제공합니다.

        entrypoint: serve path/to/my/front/controller.php
    

    entrypoint 필드는 내장된 serve 명령어를 사용합니다. 이 명령어는 PHP 런타임 내의 프로그램으로, 백그라운드에서 php-fpm 구현과 웹 서버를 시작합니다. 이 웹서버는 프런트 컨트롤러 설계 방식을 사용하여 모든 트래픽을 제공된 모든 PHP 파일로 라우팅합니다.

    serve 명령어에는 두 개의 선택적 플래그가 있습니다.

    • --workers=N: php-fpm 작업자의 N 수를 지정합니다. --workers 플래그를 설정하지 않으면 serve 명령어가 사용 가능한 메모리 양을 토대로 작업자 수를 추측합니다. 최상의 결과를 얻으려면 serve 명령어의 --workers 플래그와 max_concurrent_requests 요소의 값을 같은 수로 설정합니다.

    • --enable-dynamic-workers: 필요한 경우에만 php-fpm 작업자가 생성되도록 지정합니다. 기본값은 php-fpm 작업자에 대한 정적 정책을 사용하는 것입니다. --workers=N 플래그를 사용하여 생성되는 최대 작업자 수를 변경할 수 있습니다. 생성되는 최대 작업자 수의 기본값은 정적 정책에 따라 지정된 값입니다.

    선택적 플래그는 프런트 컨트롤러 경로 앞에 와야 합니다.

        entrypoint: serve --workers=2 --enable-dynamic-workers path/to/index.php
    
  • entrypoint 요소를 작업자 프로세스의 파일 경로에 추가하면 장기 실행 작업자 프로세스를 배포할 수 있습니다.

        entrypoint: php long-running-worker-file.php
    

    entrypoint 요소가 구독 주제가 하나인 Pub/Sub 작업자와 같이 장기 실행 프로세스로 스크립트를 실행하는 경우에는 serve 명령어를 사용하지 마세요.

자세한 내용은 app.yaml 참조를 확인하세요.

사용 설정된 확장 프로그램

App Engine용 PHP 런타임에는 다음과 같은 확장 프로그램이 사용 설정되어 있습니다.

  • BCMath
  • bz2
  • Calendar
  • core
  • cgi
  • ctype
  • cURL
  • date
  • dba
  • dom
  • enchant
  • Exif
  • fcgi
  • fileinfo
  • filter
  • FTP
  • GD
  • gettext
  • GMP
  • hash
  • iconv
  • intl
  • json
  • LDAP
  • libxml
  • mbstring
  • MYSQLi
  • mysqlnd
  • MySQL (PDO)
  • OPcache
  • OpenSSL
  • PCNTL
  • pcre
  • PDO
  • pgsql
  • Phar
  • posix
  • PostgreSQL (PDO)
  • Reflection
  • session
  • Shmop
  • SimpleXML
  • SOAP
  • Sockets
  • sodium (PHP 8.x only, not available for PHP 7.x)
  • SPL
  • SQLite (PDO)
  • SQLite3
  • standard
  • test
  • tidy
  • tokenizer
  • XML
  • XMLreader
  • XMLrpc (PHP 7.x only, not available for PHP 8.x)
  • XMLwriter
  • XSL
  • zend
  • Zip
  • Zlib

동적으로 로드 가능한 확장 프로그램

php.ini를 구성하여 다음 확장 프로그램을 동적으로 로드할 수 있습니다.

이러한 확장 프로그램을 사용 설정하려면 다음과 같이 extension 아래의 php.ini 파일에 확장 프로그램에 대한 지시문을 추가합니다.

extension=memcached.so
extension=grpc.so
extension=protobuf.so
extension=mongodb.so
extension=imagick.so
extension=opencensus.so
extension=redis.so

[opentelemetry]
extension=opentelemetry.so

환경 변수

다음 환경 변수는 런타임에서 설정됩니다.

환경 변수 설명
GAE_APPLICATION App Engine 애플리케이션 ID입니다. 이 ID는 유럽에 배포된 애플리케이션의 'e~'와 같이 'region code~'로 시작됩니다.
GAE_DEPLOYMENT_ID 현재 배포 ID입니다.
GAE_ENV App Engine 환경입니다. standard로 설정합니다.
GAE_INSTANCE 서비스가 현재 실행되고 있는 인스턴스 ID입니다.
GAE_MEMORY_MB 애플리케이션 프로세스에 제공되는 메모리 양(MB)입니다.
GAE_RUNTIME app.yaml 파일에 지정된 런타임입니다.
GAE_SERVICE app.yaml 파일에 지정된 서비스 이름입니다. 서비스 이름을 지정하지 않으면 default로 설정됩니다.
GAE_VERSION 서비스의 현재 버전 라벨입니다.
GOOGLE_CLOUD_PROJECT 애플리케이션과 연결된 Google Cloud 프로젝트 ID입니다.
PORT HTTP 요청을 수신하는 포트입니다.
NODE_ENV(Node.js 런타임에서만 사용 가능) 서비스가 배포되면 production으로 설정하세요.

app.yaml 파일에 추가 환경 변수를 정의할 수 있지만 NODE_ENV 외에는 위 값을 재정의할 수 없습니다.

HTTPS 및 전달 프록시

App Engine은 부하 분산기에서 HTTPS 연결을 종료하고 애플리케이션에 요청을 전달합니다. 일부 애플리케이션에서는 원본 요청 IP와 프로토콜을 확인해야 합니다. 사용자의 IP 주소는 표준 X-Forwarded-For 헤더에서 제공됩니다. 이 정보가 필요한 애플리케이션은 프록시를 신뢰하도록 웹 프레임워크를 구성해야 합니다.

파일 시스템

런타임에는 읽기 전용 액세스 권한이 있는 다른 모든 디렉터리와 함께 쓰기 가능한 /tmp 디렉터리가 포함됩니다. /tmp에 쓰는 데 시스템 메모리가 사용됩니다. 자세한 내용은 tempnam()sys_get_temp_dir() 지원을 참조하세요.

메타데이터 서버

애플리케이션의 각 인스턴스는 App Engine 메타데이터 서버를 사용하여 인스턴스와 프로젝트에 대한 정보를 쿼리할 수 있습니다.

다음 엔드포인트를 통해 메타데이터 서버에 액세스할 수 있습니다.

  • http://metadata
  • http://metadata.google.internal

메타데이터 서버로 전송되는 요청에는 요청 헤더 Metadata-Flavor: Google이 포함되어야 합니다. 이 헤더는 요청이 메타데이터 값을 검색하기 위해 전송되었음을 나타냅니다.

다음 표에는 특정 메타데이터에 대해 HTTP 요청을 수행할 수 있는 엔드포인트가 나열되어 있습니다.

메타데이터 엔드포인트 설명
/computeMetadata/v1/project/numeric-project-id 프로젝트에 할당된 프로젝트 번호입니다.
/computeMetadata/v1/project/project-id 프로젝트에 할당된 프로젝트 ID입니다.
/computeMetadata/v1/instance/region 인스턴스가 실행 중인 리전입니다.
/computeMetadata/v1/instance/service-accounts/default/aliases
/computeMetadata/v1/instance/service-accounts/default/email 프로젝트에 할당된 기본 서비스 계정 이메일입니다.
/computeMetadata/v1/instance/service-accounts/default/ 프로젝트의 모든 기본 서비스 계정이 나열됩니다.
/computeMetadata/v1/instance/service-accounts/default/scopes 기본 서비스 계정에 지원되는 모든 범위가 나열됩니다.
/computeMetadata/v1/instance/service-accounts/default/token 다른 Google Cloud API에 애플리케이션을 인증하기 위해 사용할 수 있는 인증 토큰을 반환합니다.

예를 들어 프로젝트 ID를 검색하려면 http://metadata.google.internal/computeMetadata/v1/project/project-id에 요청을 보냅니다.

다음은 cURL 또는 Google Cloud 클라이언트 라이브러리를 사용하여 메타데이터 엔드포인트를 호출하는 방법의 예입니다.

/**
 * Requests a key from the Metadata server using the Google Cloud SDK. Install
 * the Google Cloud SDK by running "composer install google/cloud"
 *
 * @param $metadataKey the key for the metadata server
 */
function request_metadata_using_google_cloud($metadataKey)
{
    $metadata = new Google\Cloud\Core\Compute\Metadata();
    $metadataValue = $metadata->get($metadataKey);

    return $metadataValue;
}

/**
 * Requests a key from the Metadata server using cURL.
 *
 * @param $metadataKey the key for the metadata server
 */
function request_metadata_using_curl($metadataKey)
{
    $url = 'http://metadata/computeMetadata/v1/' . $metadataKey;

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Metadata-Flavor: Google'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    return curl_exec($ch);
}

세션

PHP는 웹 앱이 요청 간에 사용자 상태 정보를 보존할 수 있게 하는 세션 관리 계층을 제공합니다. App Engine의 세션은 다른 모든 PHP 앱의 세션과 매우 유사하게 작동합니다.

다음 코드를 사용하여 사용자 세션에서 변수를 설정할 수 있습니다.

session_start();
$_SESSION['Foo'] = 'Bar';

다음 코드는 동일한 사용자의 후속 요청에서 Bar를 인쇄합니다.

session_start();
print $_SESSION['Foo']; // prints Bar

따라서 수명이 긴 세션의 경우에는 Cloud SQL과 같은 대체 스토리지 서비스를 사용합니다.

특수 $_SERVER 키

PHP는 요청 범위에서 특수한 $_SERVER[] 배열을 사용할 수 있도록 지원합니다. App Engine은 표준 CGI 매개변수 외에도 몇 가지 유용한 키를 추가합니다.

  • GAE_APPLICATION - 현재 앱의 Google Cloud 프로젝트 ID입니다.
  • GAE_DEPLOYMENT_ID - 배포된 소스 코드 ID입니다.
  • GAE_ENV - 앱이 실행되는 App Engine 환경(표준 또는 가변형)입니다.
  • GAE_INSTANCE - 현재 실행 중인 인스턴스 이름입니다.
  • GAE_MEMORY_MB - 앱 프로세스에서 사용할 수 있는 메모리 양(MB)입니다.
  • GAE_RUNTIME - app.yaml 파일에 지정하는 php72와 같은 런타임입니다.
  • GAE_SERVICE - 현재 배포된 서비스 이름입니다.
  • GAE_VERSION - 현재 배포된 버전 이름입니다.
  • GOOGLE_CLOUD_PROJECT - Google Cloud 프로젝트 ID입니다.
  • HTTP_X_APPENGINE_CITY - 요청이 시작된 도시 이름입니다. 예를 들어 Mountain View 시의 요청은 헤더 값 mountain view를 가질 수 있습니다.
  • HTTP_X_APPENGINE_CITYLATLONG - 요청이 시작된 도시의 위도와 경도입니다. Mountain View에서 시작된 요청의 경우 이 문자열이 '37.386051,-122.083851'과 같이 표시될 수 있습니다.
  • HTTP_X_APPENGINE_COUNTRY - 요청이 시작된 국가로, ISO 3166-1 alpha-2 국가 코드 형식입니다. App Engine은 클라이언트의 IP 주소에서 이 코드를 확인합니다.
  • HTTP_X_APPENGINE_HTTPS - HTTPS 사용을 확인합니다.
  • HTTP_X_APPENGINE_REGION - 요청이 시작된 리전 이름입니다. 이 값은 X-Appengine-Country에 지정된 국가를 기준으로 적용됩니다. 예를 들어 국가가 'US'이고 리전이 'ca'인 경우 'ca'는 캐나다가 아닌 '캘리포니아'를 의미합니다.
  • HTTP_X_APPENGINE_USER_IP - 클라이언트의 IP 주소입니다. $_SERVER['HTTP_X_APPENGINE_USER_IP']는 앱이 클라이언트의 IP 주소를 검색할 수 있는 유일한 방법입니다. $_SERVER['REMOTE_ADDR'] 변수는 App Engine에서 사용할 수 없습니다.

새 초기화 기본값이 있는 지시문

다음 표에서는 초기화 기본값이 php.net에서 제공되는 표준 PHP 인터프리터에 제공된 것과 다른 지시문을 보여줍니다. 다음 표에 지정되지 않은 지시문의 기본값을 찾으려면 php.ini 지시문을 참조하세요.

지시문 App Engine 기본값
expose_php Off
memory_limit -1
max_execution_time 0
error_reporting E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors Off
display_startup_errors Off
log_errors On
log_errors_max_len 0
ignore_repeated_errors Off
ignore_repeated_source Off
html_errors Off
opcache.enable On
opcache.validate_timestamps Off
opcache.memory_consumption 32

이러한 기본 지시문을 앱의 php.ini 파일에 포함하여 재정의합니다.

tempnam()sys_get_temp_dir() 지원

App Engine 앱은 /tmp 디렉터리만 쓰기가 가능하고 인스턴스의 RAM에 저장할 수 있는 보안 샌드박스에서만 실행됩니다. 이러한 이유로 App Engine의 tempnam() 버전은 Cloud Storage 버킷과 같은 영구 스토리지 솔루션에 쓸 수 있는 메모리 내 임시 파일을 반환합니다.

다음 예시에서는 file_put_contents()fwrite()를 사용하여 메모리 내 임시 파일에 쓰는 방법을 보여줍니다.

<?php
$dir = sys_get_temp_dir();
$tmp = tempnam($dir, "foo");
file_put_contents($tmp, "hello");
$f = fopen($tmp, "a");
fwrite($f, " world");
fclose($f);
echo file_get_contents($tmp);

이 예시의 예상 출력은 다음과 같습니다.

hello world

Composer로 종속 항목 관리

자세한 내용은 종속 항목 지정 페이지를 참조하세요.