PHP 7 런타임 환경

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

App Engine은 표준 환경에서 PHP 7.2 및 PHP 7.3(베타) 런타임을 지원하며 app.yaml 파일에 선언되어 있습니다.

PHP 7.2

runtime: php72

PHP 7.3(베타)

runtime: php73

PHP 버전

PHP 7 런타임 환경은 PHP 7.2 및 PHP 7.3의 최신 안정화 출시 버전을 사용합니다. App Engine은 앱 배포 시 자동으로 새로운 부 버전으로 업데이트되지만 주 버전은 자동으로 업데이트되지 않습니다.

예를 들어 애플리케이션이 PHP 7.2.0에 배포된 후에 자동으로 버전 7.2.1로 업데이트될 수는 있지만 자동으로 PHP 7.3.0으로 업데이트되지는 않습니다.

애플리케이션 시작

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

다음은 애플리케이션을 제공하는 다양한 방법을 보여줍니다.

  • 앱에 public/index.php 또는 index.php 파일이 있는 경우 App Engine은 이 파일을 사용하여 애플리케이션을 제공합니다.

    Laravel, Symfony 또는 Slim과 같은 프레임워크를 사용하는 것이 좋습니다. PHP 애플리케이션을 빠르게 작성하고 배포할 수 있는 간단한 라우팅을 제공하기 때문입니다. 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 요소(선택사항)를 맞춤설정하여 다른 파일에서 애플리케이션을 제공할 수 있습니다.

    PHP 7.2

    runtime: php72
    # the default is to serve your app using `public/index.php` or `index.php`
    entrypoint: serve path/to/my/front/controller.php
    

    PHP 7.3(베타)

    runtime: php73
    # the default is to serve your app using `public/index.php` or `index.php`
    entrypoint: serve path/to/my/front/controller.php
    

    런타임은 app.yaml 파일의 entrypoint 요소를 사용하여 애플리케이션을 시작합니다.

    entrypoint 필드는 기본 제공되는 serve 명령어를 사용합니다. 이 명령어는 PHP 7 런타임 내의 프로그램으로, 백그라운드에서 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 플래그를 사용하여 생성되는 최대 작업자 수를 변경할 수 있습니다. 생성되는 최대 작업자 수의 기본값은 정적 정책에 따라 지정된 값입니다.

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

    PHP 7.2

    runtime: php72
    entrypoint: serve --workers=2 --enable-dynamic-workers path/to/index.php
    

    PHP 7.3(베타)

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

    PHP 7.2

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

    PHP 7.3(베타)

    runtime: php73
    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
  • SPL
  • SQLite(PDO)
  • SQLite3
  • standard
  • test
  • tidy
  • tokenizer
  • XML
  • XMLreader
  • XMLrpc
  • 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
extension=stackdriver_debugger.so

환경 변수

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

환경 변수 설명
GAE_APPLICATION App Engine 애플리케이션 ID입니다.
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 애플리케이션과 연결된 GCP 프로젝트 ID입니다.
NODE_ENV 서비스가 배포되면 production으로 설정하세요.
PORT HTTP 요청을 수신하는 포트입니다.

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

HTTPS 및 전달 프록시

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

파일 시스템

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

메타데이터 서버

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

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

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

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

메타데이터 엔드포인트 설명
/computeMetadata/v1/project/numeric-project-id 프로젝트에 할당된 프로젝트 번호입니다.
/computeMetadata/v1/project/project-id 프로젝트에 할당된 프로젝트 ID입니다.
/computeMetadata/v1/instance/zone 인스턴스가 실행 중인 영역입니다.
/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 Platform 프로젝트 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 - GCP 프로젝트 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 주소입니다.

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

다음 표에는 초기화 기본값이 php.net에서 제공되는 표준 PHP 인터프리터의 기본값과 다른 지시문이 있습니다.

지시문 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로 종속 항목 관리

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

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

PHP 7.2용 App Engine 표준 환경 문서