PHP 런타임은 웹 서비스의 코드 및 종속 항목을 설치하고 서비스를 실행하는 소프트웨어 스택입니다.
App Engine 표준 환경에 PHP를 지정하려면 app.yaml
파일에서 런타임을 선언합니다. 예를 들면 다음과 같습니다.
runtime: phpVERSION
여기서 VERSION은 PHP MAJOR
및 MINOR
버전 번호입니다. 예를 들어 최신 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 파일을 가져오고 프런트 컨트롤러를 수동으로 구현하는 방법을 참조하세요.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 클라이언트 라이브러리를 사용하여 메타데이터 엔드포인트를 호출하는 방법의 예입니다.
세션
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로 종속 항목 관리
자세한 내용은 종속 항목 지정 페이지를 참조하세요.