本頁面說明如何為 App Engine 標準環境,搭配使用 PHP 執行階段安裝及使用內含的服務。您的應用程式可透過 PHP 專用的 App Engine 服務 SDK 存取套裝組合服務。
事前準備
請參閱舊版服務套裝組合 API 清單,瞭解您可以在 PHP 執行階段中呼叫的 API。
更新
app.yaml
檔案,加入下列程式碼:app_engine_apis: true
如要測試 PHP 應用程式,您必須使用
gcloud app deploy
部署應用程式。
安裝 PHP App Engine SDK
您可以在 GitHub 的 appengine-php-sdk
中找到 PHP App Engine SDK。您必須使用 PHP 8.1 以上版本的 2.1 版,以及 PHP 7.x 的 2.0.1 版。
將 SDK 納入專案的方法有兩種:
執行 Packagist 指令,將 SDK 新增至
composer.json
檔案:composer require google/appengine-php-sdk
手動建立
composer.json
檔案,並加入下列詳細資料:PHP 7/8
{ "require": { "google/appengine-php-sdk": "^2.1" // Or any later version } }
在 PHP 中,App Engine API 需要明確的依附元件規格。如要瞭解如何加入 autoload.php
,請參閱這份文件。
匯入程式庫
使用 use
運算子,從「Available APIs」清單中匯入所需的類別。例如,您可以使用以下陳述式匯入 Google\AppEngine\Api\AppIdentity\ClassName
:
use Google\AppEngine\Api\AppIdentity\ClassName;
遷移注意事項
應用程式識別
升級至 PHP 時,您不需要變更應用程式的設定。App Identity API 的行為、功能和設定說明皆維持不變。詳情請參閱「API 身分總覽」和 App Identity API 參考指南。
郵件
PHP Mail API 與 PHP 5 Mail API 大致相同,但啟用和停用 Mail 服務的方式略有不同。以下各節將說明這兩個執行階段的差異。
訊息類別
在 PHP 中,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。
郵件函式
在 PHP 5.5 中,原生 PHP mail()
函式遭到 App Engine 的 Mail 函式超載。
在 PHP 中,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()
的呼叫都會與 PHP 5.5 中的呼叫完全相同。
詳情請參閱「傳送郵件」和「接收郵件」指南,以及 Mail API 參考指南。
Memcache
如要使用 Memcache for PHP,您必須明確宣告 Memcache 程式庫。先前,PHP 5.5 適用的 Memcache 不需要明確宣告。這項明確宣告可讓您靈活地在原生 PHP Memcache 和 App Engine Memcache 之間切換。
PHP 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 適用的 Memcache API 範例:
use Google\AppEngine\Api\Memcache\Memcache;
$memcache = new Memcache();
return $memcache->get($key);
PHP 適用的 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 中使用 Memcache for PHP 5 的原始行為,可以在 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 時,您不需要變更應用程式的設定。Modules API 的行為、功能和設定說明皆維持不變。詳情請參閱「模組總覽」和 Modules API 參考指南。
工作階段
PHP 工作階段的運作方式與 PHP 5.5 工作階段相同。不過,由於 PHP 5.5 工作階段預設使用 MemcacheSessionHandler
類別,因此設定步驟有所不同。
如要使用 PHP 工作階段,您必須使用 session_set_save_handler()
註冊 MemcacheSessionHandler
類別,並將 session.save_path
設為 Memcache。存取 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 時,您不需要變更應用程式的設定。工作佇列的行為、功能和設定說明維持不變。詳情請參閱「Task Queue 總覽」指南和 Task Queue API 參考指南中的「工作階段」一節。
網址擷取
如要使用 PHP 適用的網址擷取功能,您必須明確宣告網址擷取程式庫。先前,PHP 5 的網址擷取服務不需要明確宣告,而是以隱含方式使用。
在 PHP 5 中,App Engine 的網址擷取服務是擷取 PHP 5.5 網路內容的唯一方式,因此會自動修補大部分可存取網路的 PHP 5.5 函式,以便使用 UrlFetch
。
在 PHP 中,原生 PHP 網路可存取網際網路,因此不會執行這項自動修補作業。在某些情況下,您可以使用原始的 UrlFetch
機制,特別是提供 X-Appengine-Inbound-Appid
要求標頭的機制,用於識別向您的 App Engine 應用程式提出要求的 App Engine 應用程式。
如要為 PHP 啟用網址擷取功能,您可以在串流包裝函式中使用明確宣告,或是直接使用 UrlFetch
類別,詳情請參閱下文。
選項 1a:串流處理常式
您可以啟用 App Engine 的網址擷取服務,向 http://
和 https://
PHP 串流處理常式發出 HTTP 要求。現在說明一下操作方式:
- 使用
stream_wrapper_unregister()
取消註冊 HTTP(S) 的原生 PHP 串流處理常式。 - 使用
stream_wrapper_register()
將 HTTP(S) 註冊至UrlFetchStream
類別。 - 使用要使用串流包裝函式的設定呼叫
file_get_contents()
。- 如果您想從網址擷取服務切換回原生 PHP 串流處理常式,請使用
stream_wrapper_unregister()
,然後使用stream_wrapper_restore()
註冊。
- 如果您想從網址擷取服務切換回原生 PHP 串流處理常式,請使用
如需比較,請參閱 PHP 5 和 PHP 的等效範例:
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) 回應標頭的指示,與使用資料流處理常式的指示類似:
- 使用
stream_wrapper_unregister()
取消註冊 HTTP(S) 的原生 PHP 串流處理常式。 - 使用
stream_wrapper_register()
將 HTTP(S) 註冊至UrlFetchStream
類別。 - 使用
fopen()
而非file_get_contents()
搭配所需設定。 - 呼叫
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) 要求。與串流處理常式選項不同,UrlFetch
類別不會覆寫從串流包裝函式相容函式提出的所有 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 時,您不需要變更應用程式的設定。Users API 的行為、功能和設定說明維持不變。詳情請參閱 Users API 總覽和 Users API 參考指南。
社群提供的程式庫
升級至 PHP 時,您可以使用社群貢獻的 datastore
API。
其他注意事項
如要測試 PHP 應用程式中的舊版套裝服務功能,您可以使用本機開發伺服器。執行
dev_appserver.py
指令時,請將--php_executable_path
引數設為 PHP 可執行檔。請注意,這與 PHP 5 不同,後者需要 php-cgi 可執行檔。如果專案有
composer.json
檔案,請將--php-composer-path
設為composer.phar
檔案的路徑。如要部署應用程式,請使用
gcloud app deploy
指令。PHP 執行階段的記錄功能會遵循 Cloud Logging 的記錄標準。在 PHP 執行階段中,應用程式記錄不再與要求記錄綁在一起,而是分開儲存在不同的記錄中。如要進一步瞭解如何讀取及寫入記錄,請參閱寫入及查看記錄指南。
範例
如要查看如何使用舊版套裝服務搭配 PHP 的範例,請下載程式碼範例。