PHP 7/8용 기존 번들 서비스 액세스

이 페이지에서는 App Engine 표준 환경에 대해 PHP 7/8 런타임을 사용하여 번들 서비스를 설치하고 사용하는 방법을 설명합니다. 앱은 PHP 7/8용 App Engine 서비스 SDK를 통해 번들 서비스에 액세스할 수 있습니다.

시작하기 전에

  1. PHP 7/8 런타임에서 호출할 수 있는 기존 번들 서비스 API 목록을 참조하세요.

  2. 다음 줄을 포함하도록 app.yaml 파일을 업데이트합니다.

    app_engine_apis: true
    
  3. PHP 7/8 앱을 테스트하려면 gcloud app deploy를 사용하여 배포해야 합니다.

PHP App Engine SDK 설치

PHP App Engine SDK는 GitHub의 appengine-php-sdk에서 확인할 수 있으며, PHP 8.1+에는 버전 2.1 이상을 사용해야 하며 PHP 7.x에는 버전 2.0.1 이상을 사용해야 합니다.

프로젝트에 SDK를 통합하는 방법은 두 가지가 있습니다.

  1. Packagist 명령어를 실행하여 composer.json 파일에 SDK를 추가합니다.

    composer require google/appengine-php-sdk
    
  2. 다음 세부정보가 포함된 composer.json 파일을 수동으로 만듭니다.

    PHP 7/8

    {
        "require": {
            "google/appengine-php-sdk": "^2.1" // Or any later version
        }
    }
    

PHP 7/8 버전의 경우 App Engine API에 명시적인 종속 항목 사양이 필요합니다. autoload.php를 포함하는 방법은 이 문서를 참조하세요.

라이브러리 가져오기

use 연산자를 사용하여 사용 가능한 API 목록에서 필요한 클래스를 가져옵니다. 예를 들어 다음 문을 사용하여 Google\AppEngine\Api\AppIdentity\ClassName을 가져올 수 있습니다.

use Google\AppEngine\Api\AppIdentity\ClassName;

마이그레이션 고려사항

앱 ID

PHP 7/8로 업그레이드할 때는 앱 구성을 변경할 필요가 없습니다. App Identity API의 동작, 기능, 설정 안내는 동일하게 유지됩니다. 자세한 내용은 API ID 개요App Identity API 참조 가이드를 참조하세요.

메일

PHP 7/8 Mail API는 대부분 PHP 5 Mail API와 동일하지만 메일 서비스를 사용 설정하거나 사용 중지하는 방법에 약간의 차이가 있습니다. 다음 섹션에서는 두 런타임 간의 차이점을 설명합니다.

메시지 클래스

PHP 7/8에서 Message 클래스는 PHP 5.5와 동일하게 작동하지만 use 가져오기가 업데이트되었다는 점이 다릅니다. 차이점은 다음과 같습니다.

PHP 5.5

use google\appengine\api\mail\Message;

PHP 7/8

use Google\AppEngine\Api\Mail\Message;

가져오기 문을 변경할 수 없는 경우 원래 PHP 5.5 가져오기 문도 PHP 7/8에서 작동합니다.

Mail 함수

PHP 5.5에서는 App Engine의 Mail 함수에 의해 기본 PHP mail() 함수가 오버로드되었습니다.

PHP 7/8에서는 App Engine Mail 함수가 더 이상 기본적으로 오버로드되지 않으므로 이를 명시적으로 사용 설정해야 합니다. 이 새로운 동작을 통해 필요에 맞게 Mail 함수의 용도를 변경할 수 있습니다. 이렇게 하면 모든 Mail 함수 호출에 현재 사용 중인 구현을 확인할 수 있습니다.

기본 PHP mail() 함수를 사용하여 App Engine Mail API를 사용해 메일을 보내려면 다음과 같이 php.ini 파일에서 이를 사용 설정할 수 있습니다.

extension = mailparse.so
sendmail_path = "php ./vendor/google/appengine-php-sdk/src/Runtime/SendMail.php -t -i"

앞의 예시와 같이 mailparse 확장 프로그램을 추가하여 기본 PHP 메일 함수를 사용 설정하고 sendmail_path 런타임 구성을 App Engine Mail 함수 구현으로 설정합니다. 사용 설정하면 mail()에 대한 모든 호출이 PHP 5.5에서와 동일하게 작동합니다.

자세한 내용은 메일 보내기메일 받기 가이드를 참조하고 메일 API 참조 가이드를 참조하세요.

Memcache

PHP 7/8용 Memcache를 사용하려면 Memcache 라이브러리의 명시적 선언을 추가해야 합니다. 이전에는 PHP 5.5용 Memcache에 명시적인 선언이 필요하지 않았습니다. 이러한 명시적인 선언을 통해 기본 PHP Memcache와 App Engine Memcache 간에 유연하게 전환할 수 있습니다.

PHP 7/8 Memcache 클래스는 PHP 5 Memcache 클래스와 동일한 동작을 공유하지만 명시적인 선언은 예외입니다. 자세한 내용은 Memcache 개요를 참조하세요.

PHP 5.5

PHP 5.5용 Memcache 예시:

$memcache = new Memcache();
return $memcache->get($key);

PHP 5.5용 Memcached 예시:

$memcache = new Memcached();
$memcache->set('who', $request->get('who'));
return $twig->render('memcache.html.twig', [
    'who' => $request->get('who'),
    'count' => $memcache->increment('count', 1, 0),
    'host' => $request->getHost(),
]);

PHP 7/8

PHP 7/8용 Memcache API 예시:

use Google\AppEngine\Api\Memcache\Memcache;

$memcache = new Memcache();
return $memcache->get($key);

PHP 7/8용 Memcached API 예시:

use Google\AppEngine\Api\Memcache\Memcached;

$memcache = new Memcached();
$memcache->set('who', $request->get('who'));
return $twig->render('memcache.html.twig', [
    'who' => $request->get('who'),
    'count' => $memcache->increment('count', 1, 0),
    'host' => $request->getHost(),
]);

PHP 7/8에서 PHP 5용 Memcache의 원래 동작을 사용하려면 composer.json 파일에 몇 가지 행을 더 추가하여 암시적으로 Memcache를 계속 호출하면 됩니다. Composer에서 appengine-php-sdk 패키지를 가져온 후 autoload 섹션의 files 요소에 다음 선택 파일 경로를 추가합니다.

PHP 7/8

{
  "require": {
    "google/appengine-php-sdk": "^2.1" // Or any later version
  },
  "autoload": {
    "files": [
    "./vendor/google/appengine-php-sdk/src/Api/Memcache/MemcacheOptIn.php"
    ]
  }
}

모듈

PHP 7/8로 업그레이드할 때는 앱 구성을 변경할 필요가 없습니다. Modules API의 동작, 기능, 설정 안내는 동일하게 유지됩니다. 자세한 내용은 모듈 개요모듈 API 참조 가이드를 참조하세요.

세션

PHP 7/8 세션PHP 5.5 세션과 동일한 방식으로 작동합니다. 하지만 PHP 5.5 세션에서 기본적으로 MemcacheSessionHandler 클래스를 사용했으므로 설정 안내는 다릅니다.

PHP 7/8에 세션 세션을 사용하려면 session_set_save_handler()MemcacheSessionHandler 클래스를 등록하고 Memcache에 session.save_path를 구성해야 합니다. 또한 Memcache 정보에 액세스할 때 Memcache에 수신 동의해야 합니다.

예를 들면 다음과 같습니다.

PHP 7/8

ini_set('session.save_path', 'Google\AppEngine\Api\Memcache\Memcache');
session_set_save_handler(new Google\AppEngine\Ext\Session\MemcacheSessionHandler(), true);

자세한 내용은 Session API 참조 가이드를 확인하세요.

태스크 큐

PHP 7/8로 업그레이드할 때는 앱 구성을 변경할 필요가 없습니다. 태스크 큐의 동작, 기능, 설정 안내는 그대로 유지됩니다. 자세한 내용은 Task Queue 개요 가이드 및 Task Queue API 참조 가이드의 세션 섹션을 참조하세요.

URL 가져오기

PHP 7/8용 URL Fetch를 사용하려면 URL Fetch 라이브러리의 명시적 선언을 추가해야 합니다. 이전에는 PHP 5용 URL Fetch 서비스에 명시적 선언이 필요하지 않았고 암시적으로 사용되었습니다.

PHP 5에서 App Engine의 URL Fetch 서비스는 PHP 5.5에서 인터넷 콘텐츠를 가져오는 유일한 방법이므로 인터넷에 액세스한 대부분의 PHP 5.5 함수에는 UrlFetch가 사용되도록 자동으로 패치가 수행되었습니다.

PHP 7/8에서는 기본 PHP 네트워킹이 인터넷에 액세스할 수 있으므로 이 자동 패치가 수행되지 않습니다. 일부 경우에는 원래 UrlFetch 메커니즘, 특히 App Engine 앱에 요청을 보내는 App Engine 앱을 식별하기 위한 X-Appengine-Inbound-Appid 요청 헤더를 제공하는 메커니즘을 사용할 수 있습니다.

PHP 7/8용 URL Fetch를 사용 설정하려면 스트림 래퍼에서 명시적 선언을 사용하거나 다음 섹션에서 설명하는 UrlFetch 클래스를 직접 사용하면 됩니다.

옵션 1a 스트림 핸들러

App Engine의 URL Fetch 서비스를 사용 설정하여 http://https:// PHP 스트림 핸들러에 HTTP 요청을 보낼 수 있습니다. 그러려면 다음 안내를 따르세요.

  1. stream_wrapper_unregister()를 사용하여 HTTP(S)의 기본 PHP 스트림 핸들러를 등록 취소합니다.
  2. stream_wrapper_register()를 사용하여 HTTP(S)를 UrlFetchStream 클래스에 등록합니다.
  3. 스트림 래퍼를 사용하려는 구성으로 file_get_contents()를 호출합니다.

비교는 PHP 5 및 PHP 7/8에 해당하는 예시를 참조하세요.

PHP 5.5

...
$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);

// Using Url Fetch service. No option to use the native php stream wrapper.
$result = file_get_contents('http://example.com', false, $context);
echo $result;

PHP 7/8

use google\appengine\api\urlfetch\UrlFetchStream;
...
$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);

// Using the native php stream wrapper.
$result = file_get_contents('http://example.com', false, $context);
echo $result;

stream_wrapper_unregister("http");
stream_wrapper_register("http", "UrlFetchStream");

// Now using the Url Fetch service.
$result = file_get_contents('http://example.com', false, $context);
echo $result;

stream_wrapper_unregister("http");
stream_wrapper_restore("http");

// Now using the native php stream wrapper again.

옵션 1b 스트림 핸들러가 있는 HTTP 응답 헤더

스트림 핸들러가 있는 HTTP(S) 응답 헤더를 사용하는 방법은 스트림 핸들러 사용 안내와 비슷합니다.

  1. stream_wrapper_unregister()를 사용하여 HTTP(S)의 기본 PHP 스트림 핸들러를 등록 취소합니다.
  2. stream_wrapper_register()를 사용하여 UrlFetchStream 클래스에 HTTP(S)를 등록합니다.
  3. 원하는 구성으로 file_get_contents() 대신 fopen()을 사용합니다.
  4. stream_get_meta_data()를 호출하고 'wrapper_data의 메타데이터에 색인을 생성하여 응답 헤더 정보를 추출합니다. 응답 헤더는 PHP 5.5의 $http_response_header와 유사한 배열 형식으로 반환됩니다.

PHP 5.5

...
$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);

// Using file_get_contents and the Url Fetch service.
$result = file_get_contents('http://example.com', false, $context);

// Print Http Response Headers
print_r($http_response_header);

PHP 7/8

use google\appengine\api\urlfetch\UrlFetchStream;
...
$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);

stream_wrapper_unregister("http");
stream_wrapper_register("http", "UrlFetchStream");

// Now using fopen and the Url Fetch service.
$result = fopen('http://example.com', 'r', false, $context);

// Print Http Response Headers
$meta_data = stream_get_meta_data($result);
$headers = $meta_data['wrapper_data'];
print_r($headers);

stream_wrapper_unregister("http");
stream_wrapper_restore("http");

옵션 2. UrlFetch 클래스

UrlFetch 클래스는 HTTP(S) 요청에 더 작은 범위에서 URL Fetch 서비스를 사용하는, 더 타겟팅된 방법을 제공하는 커스텀 클래스입니다. 스트림 핸들러 옵션과 달리 UrlFetch 클래스는 URL Fetch 서비스를 사용하기 위해 스트림 래퍼 호환 함수에서 수행된 모든 HTTP(S) 요청을 재정의하지 않습니다. 스트림 핸들러 옵션과 비교하여 UrlFetch 클래스 구성은 다음과 같은 다양한 PHP API를 사용할 필요가 없으므로 더 간단합니다.

  • stream_context_create()
  • stream_wrapper_unregister()
  • stream_wrapper_register()
  • file_get_contents()

다음 UrlFetch 클래스 예시는 스트림 핸들러 예시와 같습니다.

PHP 7/8

use google\appengine\api\urlfetch\UrlFetch;
...
$urlfetch = new UrlFetch();
$result = $urlfetch->fetch($url, 'POST', $headers, http_build_query($data));
echo $result->getContent();

사용자

PHP 7/8로 업그레이드할 때는 앱 구성을 변경할 필요가 없습니다. Users API의 동작, 기능, 설정 안내는 동일하게 유지됩니다. 자세한 내용은 Users API 개요Users API 참조 가이드를 참조하세요.

커뮤니티 기부 라이브러리

PHP 7/8로 업그레이드할 때 datastore용 커뮤니티 기부 API를 사용할 수 있습니다.

기타 고려사항

  • PHP 7/8 앱에서 기존 번들 서비스 기능을 테스트하려면 로컬 개발 서버를 사용할 수 있습니다. dev_appserver.py 명령어를 실행할 때 --php_executable_path 인수를 PHP 7/8 실행 파일로 설정합니다. 이는 php-cgi 실행 파일이 필요한 PHP 5와 다릅니다.

    프로젝트에 composer.json 파일이 있으면 --php-composer-pathcomposer.phar 파일의 경로로 설정합니다.

  • 앱을 배포하려면 gcloud app deploy 명령어를 사용합니다.

  • PHP 7/8 런타임의 로깅은 Cloud Logging의 로깅 표준을 따릅니다. PHP 7/8 런타임에서 앱 로그는 더 이상 요청 로그와 번들로 묶이지 않고 다른 레코드로 분리됩니다. 로그 읽기 및 쓰기에 대한 자세한 내용은 로그 작성 및 보기 가이드를 참조하세요.

예시

PHP로 기존 번들 서비스를 사용하는 방법의 예시를 보려면 코드 샘플을 다운로드하세요.