PHP 런타임

PHP 런타임은 애플리케이션 코드 및 종속 항목을 설치한 후 가변형 환경에서 해당 애플리케이션을 실행하는 소프트웨어 스택입니다.

  • 7.4 이상 버전은 빌드팩을 사용하여 빌드되므로 app.yaml 파일에서 운영체제를 선택해야 합니다. 예를 들어 PHP 8.3을 사용하려면 Ubuntu 22를 운영체제로 지정해야 합니다.

  • 7.3 버전 이하는 Docker를 사용하여 빌드됩니다.

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

PHP 버전 선택

새 런타임 버전

PHP 런타임 버전 7.4 이상의 경우 다음을 수행해야 합니다.

  • app.yaml 파일에 runtime_configoperating_system 설정을 포함하여 운영체제를 지정합니다.

  • app.yaml 파일에서 애플리케이션의 문서 루트를 선언합니다.

      runtime: php
      env: flex
    
      runtime_config:
          operating_system: "ubuntu22"
          document_root: .
    

    프로젝트 루트(.) 디렉터리를 문서 루트로 지정할 수 있지만 document_root 설정에 하위 디렉터리를 사용하는 것이 좋습니다.

    PHP 버전 7.4 이상에서는 소스 코드가 루트 디렉터리(/) 대신 /workspace 디렉터리에 있습니다. 구성을 재정의하면 NGINX 또는 supervisor 프로세스가 이 디렉터리의 구성 파일을 참조합니다. 해당 참조를 업데이트하려면 다음을 수행해야 합니다.

    • NGINX 구성의 모든 include 문을 /etc/nginx가 아닌 /workspace를 기준으로 업데이트하세요.
    • gzip_params와 같은 일부 파일은 포함되지 않습니다. 이러한 파일을 참조하려면 자체 파일 또는 GitHub의 사본을 포함합니다. mime.typesfastcgi_params와 같은 파일은 /etc/nginx 디렉터리에서 사용할 수 있습니다.
    • nginx-plus-module-ndk와 같은 일부 NGINX 모듈은 설치되지 않았습니다. $docroot 값을 설정하거나 NGINX 구성 파일에서 값을 수동으로 추가합니다.
  • gcloud CLI 버전 420.0.0 이상을 설치합니다. gcloud components update 명령어를 실행하여 CLI 도구를 업데이트할 수 있습니다. 설치된 버전을 보려면 gcloud version 명령어를 실행하면 됩니다.

선택사항으로 런타임 버전을 지정할 수 있는 방법은 다음과 같습니다.

  • app.yamlruntime_version 설정을 포함합니다. runtime_version 설정이 지정되지 않으면 기본적으로 최신 PHP 버전이 사용됩니다. 예를 들어

    • Ubuntu 22에서 PHP 8.3을 지정하려면 다음 안내를 따르세요.

      runtime: php
      env: flex
      
      runtime_config:
          operating_system: "ubuntu22"
          runtime_version: "8.3"
          document_root: .
      
    • Ubuntu 22에서 지원되는 최신 PHP 버전을 지정하려면 다음을 실행합니다.

        runtime: php
        env: flex
      
        runtime_config:
            operating_system: "ubuntu22"
            document_root: .
      
  • composer.json 파일에 PHP 버전을 포함합니다.

    {
        "require": {
            "php": "8.3.*"
        }
    }
    

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

이전 런타임 버전

PHP 버전 7.3 이하의 경우 다음을 수행해야 합니다.

  • 애플리케이션의 문서 루트를 선언합니다. app.yaml 파일에서 수행할 수 있습니다.

    runtime: php
    env: flex
    api_version: 1
    
    runtime_config:
      document_root: .
    

    프로젝트 루트(.) 디렉토리를 문서 루트로 지정할 수 있지만 document_root 설정에 하위 디렉터리를 사용하는 것이 좋습니다.

  • 새 버전의 PHP를 사용할 수 있게 되면 애플리케이션이 자동으로 업그레이드되지 않도록 composer.json 파일에 PHP 버전을 지정합니다.

    {
        "require": {
            "php": "7.3.*"
        }
    }
    

PHP 7.3은 Ubuntu 16.04를 기반으로 합니다.

NGINX 맞춤설정

커스텀 구성 파일을 정의하려면 다음 안내를 따르세요.

v7.4 이상

프로젝트의 루트 디렉터리에 nginx-app.conf 파일을 포함합니다.

기본적으로 프레임워크 프런트 컨트롤러는 index.php 파일을 사용합니다. 프로젝트에 맞춰 이 값을 다른 값으로 변경해야 할 수도 있습니다. 예를 들어 Symfony 프레임워크는 index.php 대신 app.php를 사용합니다. app.yaml 파일의 runtime_config 섹션에서 파일 이름을 변경할 수 있습니다.

runtime: php
env: flex

runtime_config:
operating_system: "ubuntu22"
document_root: .
front_controller_file: app.php

v7.3 이하

nginx-app.conf 구성 파일은 기본 NGINX 구성 파일의 서버 섹션에 포함되어 있습니다. 예를 들어 기본 구성 php-app.conf 파일에는 다음이 포함됩니다.

location / {
# try to serve files directly, fallback to the front controller
try_files $uri /$front_controller_file$is_args$args;
}

커스텀 구성 파일을 정의하려면 프로젝트의 루트 디렉터리에 nginx-app.conf 파일을 만듭니다. 런타임은 사용자가 제공한 파일로 기본 파일을 대체합니다.

기본적으로 프레임워크 프런트 컨트롤러는 index.php 파일을 사용합니다. 프로젝트에 맞춰 이 값을 다른 값으로 변경해야 할 수도 있습니다. 예를 들어 Symfony 프레임워크는 index.php 대신 app.php를 사용합니다. app.yaml 파일의 runtime_config 섹션에서 파일 이름을 변경할 수 있습니다.

runtime: php
env: flex

runtime_config:
document_root: .
front_controller_file: app.php

OPcache

PHP 7.3 이하 버전에는 기본적으로 OPcache가 컴파일 및 사용 설정되어 있습니다. PHP 7.4 이상에서는 php.ini 파일에서 사용 설정해야 합니다. OPcache를 구성하는 방법은 공식 문서를 참조하세요.

OPcache를 중지하려면 php.ini 파일을 만들거나 다음 줄을 사용하여 수정합니다.

opcache.enable=0

종속 항목

런타임에서는 애플리케이션 소스 디렉터리에서 composer.json 파일을 찾아 composer를 사용해 애플리케이션을 시작하기 전에 종속 항목을 설치합니다. 패키지 선언 및 관리에 대한 자세한 내용은 PHP 라이브러리 사용을 참조하세요.

PHP 확장 프로그램 사용

다음 PHP 확장 프로그램은 시스템에 사전 설치 및 사용 설정되어 있습니다.

v7.4 이상

php.ini 파일을 사용하여 다음 확장 프로그램을 사용 설정할 수 있습니다.

v7.3 이하

다음 PHP 확장 프로그램은 기본적으로 사용 중지되어 있습니다. php.ini 파일을 사용하여 다음 확장 프로그램을 사용 설정할 수 있습니다.

확장 프로그램을 사용 설정하려면 extension 지시어로 애플리케이션의 루트에 php.ini 파일을 추가합니다.

; Enable the Redis extension
extension=redis.so

; Enable the OpenTelemetry extension (must be in an opentelemetry section)
[opentelemetry]
extension=opentelemetry.so

또는 composer.jsonrequire를 추가하여 확장명을 사용 설정할 수도 있습니다.

{
    "require": {
        "ext-redis": "*"
    }
}

이 패키지를 사용하면 가장 널리 사용되는 PHP 확장을 설치할 수 있습니다. 운영체제 수준의 종속 항목이 추가로 필요한 애플리케이션인 경우 PHP 런타임을 확장하거나 커스텀 런타임을 사용하여 적절한 패키지를 설치합니다.

HTTPS 및 전달 프록시

App Engine은 부하 분산기에서 HTTPS 연결을 종료하고 요청을 애플리케이션에 전달합니다. NGINX 서버는 HTTPS를 통해 요청할 때 HTTPS 환경 변수($_SERVER["HTTPS"])를 on으로 설정하도록 구성됩니다.

일부 애플리케이션은 사용자 IP 주소도 확인해야 합니다. 사용자 IP 주소는 표준 X-Forwarded-For 헤더에서 제공됩니다.

사용 중지된 함수

다음 함수는 php.inidisable_functions 지시문으로 중지됩니다.

  • exec
  • passthru
  • proc_open
  • proc_close
  • shell_exec
  • show_source
  • symlink
  • system

위 함수 중 하나가 필요한 경우 애플리케이션 루트에 php.ini 파일을 추가하고 disable_functions 지시문을 변경합니다. 또는 app.yamlruntime_config 섹션에 있는 whitelist_functions를 쉼표로 구분된 함수 목록이 허용되도록 설정합니다.

PHP 버전 7.3 이하에서는 시뮬레이션 모드로 실행되도록 기본적으로 Suhosin Security 확장 프로그램이 설치 및 구성됩니다. 시뮬레이션 모드는 위험할 가능성이 있는 함수의 사용을 로깅하며 Cloud Logging UI에 표시됩니다. 시뮬레이션 모드를 사용 중지하면 잠재적으로 위험한 함수를 사용할 때 애플리케이션이 종료됩니다. 이 추가 보안 기능을 사용하려면 다음 옵션을 사용하여 프로젝트 루트에 php.ini를 추가합니다.

; Prevent the use of potentially dangerous functions rather than logging them
suhosin.simulation = Off

패치가 적용된 함수

parse_str 함수는 패치되고 두 번째 매개변수는 필수입니다. 매개변수 하나만 사용하여 parse_str를 호출할 경우 경고가 발생하고 함수가 호출되지 않습니다.

사용 가능한 구성

runtime_config 섹션에 다음 구성을 포함할 수 있습니다.

이름설명기본값
document_root nginx와 PHP에 DOCUMENT_ROOT을 지정합니다. 프로젝트 루트 디렉토리의 상대 경로를 사용해야 합니다. 필수 필드
composer_flags 이 키를 사용하여 일부 작성기 플래그를 재정의할 수 있습니다. --no-dev --prefer-dist
enable_stackdriver_integration 버전 7.3 이하에서만 지원됩니다. true로 설정하면 런타임에 Google Cloud Observability 통합이 자동으로 사용 설정됩니다. 이 구성에는 google/cloud 패키지 v0.33 이상이 필요합니다. false
skip_lockdown_document_root 버전 7.3 이하에서만 지원됩니다. 기본적으로 런타임은 document_root 디렉토리 아래의 모든 파일과 디렉토리에 엄격한 읽기 전용 권한을 설정합니다. true로 설정하면 런타임에서 권한 변경을 건너뜁니다. false
whitelist_functions 버전 7.3 이하에서만 지원됩니다. 허용 목록에 추가할 쉼표로 구분된 함수 이름 목록입니다. 빈 문자열
front_controller_file 디렉터리 액세스를 위한 기본 PHP 파일 이름입니다. index.php
nginx_conf_http_include 기본 nginx 구성 파일의 http 섹션에 포함될 부분 nginx 구성 파일의 파일 이름입니다. nginx-http.conf
nginx_conf_include 기본 nginx 구성 파일의 server 섹션에 포함될 부분 nginx 구성 파일의 파일 이름입니다. nginx-app.conf
nginx_conf_override 사용자가 제공한 nginx 구성 파일의 파일 이름이며, nginx 기본 구성 파일로 사용됩니다. nginx.conf
php_fpm_conf_override 사용자가 제공한 php-fpm 구성 파일의 파일 이름이며, [app] 섹션의 하단에 포함되어 기존 구성을 덮어씁니다. php-fpm.conf
php_ini_override 사용자가 제공한 PHP 구성 파일의 파일 이름입니다. php.ini
supervisord_conf_addition 사용자가 제공한 supervisord 구성 파일의 파일 이름이며, 기본 supervisord 구성 파일에 포함됩니다. additional-supervisord.conf
supervisord_conf_override 사용자가 제공한 supervisord 구성 파일의 파일 이름이며, 기본 supervisord 구성 파일을 재정의합니다. supervisord.conf

PHP 런타임에서 supervisord 구성

App Engine 가변형 환경에서는 supervisord를 사용하여 프로세스를 관리합니다. 기본적으로 supervisordnginxphp-fpm을 실행하여 PHP 웹 애플리케이션을 실행합니다. 그러나 일부 애플리케이션은 외부 프로세스를 실행해야 합니다. 또한 이러한 응용 프로그램은 때로는 nginxphp-fpm을 필요로 하지 않습니다.

supervisord에서 관리하는 프로세스를 추가하려면 additional-supervisord.conf라는 파일을 프로젝트 루트 디렉터리에 추가합니다. 다음은 이러한 구성 파일 콘텐츠의 예시입니다.

[program:quote-updater]
command = php %(ENV_APP_DIR)s/worker.php
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes=0
user = www-data
autostart = true
autorestart = true
priority = 5
stopwaitsecs = 20

nginxphp-fpm을 프로세스로 바꾸려면 supervisord.conf라는 파일을 프로젝트 루트 디렉터리에 추가합니다. 다음은 이러한 구성 파일 콘텐츠의 예시입니다.

[supervisord]
nodaemon = true
logfile = /dev/null
logfile_maxbytes = 0
pidfile = /var/run/supervisord.pid

[program:react-server]
command = php %(ENV_APP_DIR)s/index.php
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes=0
user = www-data
autostart = true
autorestart = true
priority = 5
stopwaitsecs = 20

런타임 확장

App Engine 가변형 환경 PHP 런타임을 사용하여 커스텀 런타임을 만들 수 있습니다. 자세한 내용은 PHP 런타임 맞춤설정을 참조하세요.

환경 변수

런타임 환경에서 설정되는 환경 변수는 다음과 같습니다.

환경 변수 설명
GAE_INSTANCE 현재 인스턴스의 이름입니다.
GAE_MEMORY_MB 애플리케이션 프로세스에서 사용할 수 있는 메모리 양입니다.
GAE_SERVICE 애플리케이션의 app.yaml 파일에 지정된 서비스 이름이거나 서비스 이름이 지정되지 않은 경우 default로 설정됩니다.
GAE_VERSION 현재 애플리케이션의 버전 라벨입니다.
GOOGLE_CLOUD_PROJECT 애플리케이션과 연결된 프로젝트 ID로, Google Cloud 콘솔에 표시됩니다.
PORT HTTP 요청을 수신할 포트

app.yaml로 추가 환경 변수를 설정할 수 있습니다.

메타데이터 서버

애플리케이션의 각 인스턴스에서 Compute Engine 메타데이터 서버를 사용해 호스트 이름, 외부 IP 주소, 인스턴스 ID, 커스텀 메타데이터, 서비스 계정 정보 등의 인스턴스 관련 정보를 쿼리할 수 있습니다. App Engine에서는 인스턴스별로 커스텀 메타데이터를 설정할 수 없지만 프로젝트 차원의 커스텀 메타데이터를 설정해 App Engine 및 Compute Engine 인스턴스에서 읽는 것은 가능합니다.

이 예시 함수는 메타데이터 서버를 사용하여 PHP 버전 7.3 이하 인스턴스의 외부 IP 주소를 가져옵니다. PHP 7.4 이상의 경우 PHP 런타임 섹션의 예시를 참조하세요.

function get_external_ip_using_google_cloud()
{
    $metadata = new Google\Cloud\Core\Compute\Metadata();
    $externalIp = $metadata->get(
        'instance/network-interfaces/0/access-configs/0/external-ip');

    return $externalIp;
}

function get_external_ip_using_curl()
{
    $url = 'http://metadata.google.internal/computeMetadata/v1/' .
        'instance/network-interfaces/0/access-configs/0/external-ip';

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