Auf dieser Seite wird beschrieben, wie Sie die gebündelten Dienste mit der PHP-Laufzeit für die App Engine-Standardumgebung installieren und verwenden. Ihre Anwendung kann über das App Engine Services SDK für PHP auf die gebündelten Dienste zugreifen.
Hinweise
Weitere Informationen finden Sie in der Liste der gebündelten Legacy-Dienst-APIs, die Sie in der PHP-Laufzeit aufrufen können.
Aktualisieren Sie die Datei
app.yaml
mit der folgenden Zeile:app_engine_apis: true
Wenn Sie Ihre PHP-Anwendung testen möchten, müssen Sie sie mit
gcloud app deploy
bereitstellen.
PHP App Engine SDK installieren
Sie finden das PHP App Engine SDK auf GitHub unter appengine-php-sdk
. Sie müssen Version 2.1 oder höher für PHP 8.1+ und Version 2.0.1 oder höher für PHP 7.x verwenden.
Es gibt zwei Möglichkeiten, das SDK in dein Projekt einzubinden:
Führen Sie den Befehl Packagist aus, um das SDK zu Ihrer Datei
composer.json
hinzuzufügen:composer require google/appengine-php-sdk
Erstellen Sie manuell eine
composer.json
-Datei mit den folgenden Details:PHP 7/8
{ "require": { "google/appengine-php-sdk": "^2.1" // Or any later version } }
In PHP erfordern App Engine APIs eine explizite Abhängigkeitsspezifikation. Eine Anleitung zum Einbinden von autoload.php
finden Sie in diesem Dokument.
Bibliotheken importieren
Verwenden Sie den Operator use
, um die benötigte Klasse aus der Liste der verfügbaren APIs zu importieren. Beispielsweise kann Google\AppEngine\Api\AppIdentity\ClassName
mit der Anweisung importiert werden:
use Google\AppEngine\Api\AppIdentity\ClassName;
Hinweise zur Migration
Anwendungsidentität
Sie müssen bei einem Upgrade auf PHP die Konfiguration der Anwendung nicht ändern. Das Verhalten, die Features und die Einrichtungsanleitung für die App Identity API bleiben gleich. Weitere Informationen finden Sie in der Übersicht über API Identity und im Referenzleitfaden zur App Identity API.
Die PHP Mail API bleibt weitgehend gleich wie die PHP 5 Mail API. Es gibt jedoch einige Unterschiede bei der Aktivierung und Deaktivierung der E-Mail-Dienste. In den folgenden Abschnitten werden die Unterschiede zwischen beiden Laufzeiten behandelt.
Nachrichtenklasse
In PHP funktioniert die Message
-Klasse genauso wie in PHP 5.5, mit der Ausnahme, dass die use
-Importe aktualisiert wurden. Es bestehen jedoch folgende Unterschiede:
PHP 5.5
use google\appengine\api\mail\Message;
PHP 7/8
use Google\AppEngine\Api\Mail\Message;
Wenn Sie die Importanweisungen nicht ändern können, funktioniert die ursprüngliche PHP 5.5-Importanweisung auch für PHP.
E-Mail-Funktion
In PHP 5.5 war die native PHP-Funktion mail()
mit der E-Mail-Funktion von App Engine überlastet.
In PHP ist die E-Mail-Funktion von App Engine standardmäßig nicht mehr überlastet, und muss explizit aktiviert werden. Durch dieses neue Verhalten können Sie die E-Mail-Funktion neu an Ihre Anforderungen anpassen. Mit dieser Änderung können Sie auch sehen, welche Implementierung derzeit für alle Aufrufe der E-Mail-Funktions verwendet wird.
Wenn Sie die native PHP-Funktion mail()
verwenden möchten, um E-Mails über die App Engine Mail API zu senden, können Sie sie so in Ihrer Datei php.ini
aktivieren:
extension = mailparse.so
sendmail_path = "php ./vendor/google/appengine-php-sdk/src/Runtime/SendMail.php -t -i"
Fügen Sie wie im vorherigen Beispiel die Erweiterung "mailparse" hinzu, um die native PHP-E-Mail-Funktion zu aktivieren, und legen Sie die Laufzeitkonfiguration sendmail_path
auf die Implementierung der E-Mail-Funktion von App Engine fest. Nach der Aktivierung funktionieren alle Aufrufe von mail()
genau wie in PHP 5.5.
Weitere Informationen finden Sie in den Leitfäden E-Mails senden und E-Mails empfangen und im Referenzleitfaden für die Mail API.
Memcache
Zur Verwendung von Memcache für PHP müssen Sie die Memcache-Bibliotheken explizit deklarieren. Bisher war für Memcache für PHP 5.5 keine explizite Deklaration erforderlich. Diese explizite Deklaration bietet Flexibilität beim Wechsel zwischen dem nativen PHP-Memcache und dem App Engine-Memcache.
PHP-Memcache-Klassen haben das gleiche Verhalten wie PHP 5-Memcache-Klassen mit Ausnahme der expliziten Deklaration. Weitere Informationen finden Sie in der Memcache-Übersicht.
PHP 5.5
Beispiel für Memcache für PHP 5.5:
$memcache = new Memcache();
return $memcache->get($key);
Beispiel für Memcached für PHP 5.5:
$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
Beispiel für die Memcache API für PHP:
use Google\AppEngine\Api\Memcache\Memcache;
$memcache = new Memcache();
return $memcache->get($key);
Beispiel für die Memcached API für PHP:
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(),
]);
Wenn Sie das ursprüngliche Verhalten von Memcache für PHP 5 in PHP verwenden möchten, können Sie Memcache implizit aufrufen, indem Sie einige weitere Zeilen in Ihre composer.json
-Datei einfügen. Nach dem Import des appengine-php-sdk
-Pakets vom Composer fügen Sie den folgenden Dateipfad zur Opt-in-Datei in das files
-Element im Abschnitt autoload
ein:
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"
]
}
}
Module
Sie müssen bei einem Upgrade auf PHP die Konfiguration der Anwendung nicht ändern. Das Verhalten, die Funktionen und die Einrichtungsanweisungen für die Modules API bleiben gleich. Weitere Informationen finden Sie in der Übersicht über Module und im Referenzhandbuch für die Module API.
Sitzung
PHP-Sitzungen funktionieren genauso wie PHP 5.5-Sitzungen.
Die Anleitungen für die Einrichtung unterscheiden sich jedoch, da PHP 5.5-Sitzungen standardmäßig die Klasse MemcacheSessionHandler
verwendet haben.
Wenn Sie Sitzungen für PHP verwenden möchten, müssen Sie die Klasse MemcacheSessionHandler
bei session_set_save_handler()
registrieren und session.save_path
für Memcache konfigurieren. Außerdem sollten Sie Memcache aktivieren, wenn Sie auf Memcache-Informationen zugreifen.
Beispiel:
PHP 7/8
ini_set('session.save_path', 'Google\AppEngine\Api\Memcache\Memcache');
session_set_save_handler(new Google\AppEngine\Ext\Session\MemcacheSessionHandler(), true);
Weitere Informationen finden Sie in der Referenz zur Session API.
Aufgabenwarteschlange
Sie müssen bei einem Upgrade auf PHP die Konfiguration der Anwendung nicht ändern. Das Verhalten, die Features und die Einrichtungsanleitung für die Aufgabenwarteschlange bleiben unverändert. Weitere Informationen finden Sie im Abschnitt Aufgabenwarteschlange – Übersicht und im Referenzleitfaden für die Task Queue API.
URL-Abruf
Um den URL-Abruf für PHP zu verwenden, müssen Sie eine explizite Deklaration der URL-Abrufbibliotheken hinzufügen. Bisher war für den URL-Abrufdienst für PHP 5 keine explizite Deklaration erforderlich, denn er wurde implizit verwendet.
In PHP 5 war der URL-Abrufdienst von App Engine die einzige Möglichkeit, Internetinhalte in PHP 5.5 abzurufen. Die meisten PHP 5.5-Features, die auf das Internet zugegriffen haben, wurden daher für die automatische Verwendung von UrlFetch
gepatcht.
In PHP kann das native PHP-Netzwerk auf das Internet zugreifen, sodass dieses automatische Patching nicht ausgeführt wird. In einigen Fällen können Sie den ursprünglichen UrlFetch
-Mechanismus verwenden, insbesondere den Mechanismus, der den X-Appengine-Inbound-Appid
-Anfrageheader zur Identifizierung derjenigen App Engine-Anwendung bereitstellt, die eine Anfrage an Ihre App Engine-Anwendung sendet.
Zum Aktivieren des URL-Abrufdiensts für PHP können Sie entweder eine explizite Deklaration im Stream-Wrapper verwenden oder die Klasse UrlFetch
direkt verwenden. Eine Beschreibung hierzu finden Sie in den folgenden Abschnitten.
Option 1a. Stream-Handler
Sie können den URL-Abrufdienst von App Engine aktivieren, um HTTP-Anfragen an die beiden PHP-Stream-Handler http://
und https://
zu senden. Gehen Sie so vor:
- Heben Sie die Registrierung des nativen PHP-Stream-Handlers für HTTP(S) mit
stream_wrapper_unregister()
auf. - Registrieren Sie HTTP(S) mit
stream_wrapper_register()
in der KlasseUrlFetchStream
. - Rufen Sie
file_get_contents()
mit der Konfiguration auf, die Sie für den Stream-Wrapper verwenden möchten.- Wenn Sie vom URL-Abrufdienst zum nativen PHP-Stream-Handler zurückkehren möchten, verwenden Sie
stream_wrapper_unregister()
und registrieren Sie sich dann mitstream_wrapper_restore()
.
- Wenn Sie vom URL-Abrufdienst zum nativen PHP-Stream-Handler zurückkehren möchten, verwenden Sie
Vergleiche finden Sie in den entsprechenden Beispielen für PHP 5 und 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.
Option 1b. HTTP-Antwortheader mit Stream-Handlern
Die Anleitung zur Verwendung von HTTP(S)-Antwortheadern mit Stream-Handlern ähnelt der Anleitung für die Verwendung von Stream-Handlern:
- Heben Sie die Registrierung des nativen PHP-Stream-Handlers für HTTP(S) mit
stream_wrapper_unregister()
auf. - Registrieren Sie HTTP(S) mithilfe von
stream_wrapper_register()
in der KlasseUrlFetchStream
. - Verwenden Sie
fopen()
anstelle vonfile_get_contents()
mit der gewünschten Konfiguration. - Rufen Sie
stream_get_meta_data()
auf und extrahieren Sie die Antwortheaderinformationen, indem Sie Metadaten für'wrapper_data
indexieren. Die Antwortheader werden in einer Arrayform ähnlich wie$http_response_header
in PHP 5.5 zurückgegeben.
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");
Option 2. UrlFetch-Klasse
Die Klasse UrlFetch
ist eine benutzerdefinierte Klasse, die eine zielgerichtetere Möglichkeit bietet, den URL-Abrufdienst für eine HTTP(S)-Anfrage in einem kleineren Bereich zu verwenden.
Anders als bei der Option des Stream-Handlers überschreibt die Klasse UrlFetch
nicht alle HTTP(S)-Anfragen von Funktionen, die mit Stream-Wrappern kompatibel sind, um den URL-Abrufdienst zu verwenden. Im Vergleich zur Option "Stream-Handler" ist die Klassenkonfiguration UrlFetch
außerdem einfacher, da hier keine PHP APIs verwendet werden müssen, wie beispielsweise die folgenden:
stream_context_create()
stream_wrapper_unregister()
stream_wrapper_register()
file_get_contents()
Das folgende Beispiel einer UrlFetch
-Klasse entspricht dem Stream-Handler-Beispiel:
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();
Nutzer
Sie müssen bei einem Upgrade auf PHP die Konfiguration der Anwendung nicht ändern. Das Verhalten, die Features und die Einrichtungsanleitung für die Users API bleiben gleich. Weitere Informationen finden Sie in der Übersicht über die Users API und im Referenzhandbuch für die Users API.
Von der Community eingebrachte Bibliotheken
Für das Upgrade auf PHP können Sie die von der Community bereitgestellte API für datastore
verwenden.
Weitere Hinweise
Wenn Sie die Funktionen der gebündelten Legacy-Dienste in Ihrer PHP-Anwendung testen möchten, können Sie den lokalen Entwicklungsserver verwenden. Setzen Sie beim Ausführen des Befehls
dev_appserver.py
das Argument--php_executable_path
auf eine ausführbare PHP-Datei. Dies unterscheidet sich von PHP 5, für das eine ausführbare php-cgi erforderlich ist.Wenn das Projekt eine Datei
composer.json
hat, legen Sie für--php-composer-path
den Pfad der Dateicomposer.phar
fest.Verwenden Sie zum Bereitstellen der Anwendung den Befehl
gcloud app deploy
.Das Logging in der PHP-Laufzeit entspricht dem Logging-Standard in Cloud Logging. In der PHP-Laufzeit werden Anwendungslogs nicht mehr mit den Anfragelogs gebündelt, sondern in verschiedenen Einträgen getrennt. Weitere Informationen zum Lesen und Schreiben von Logs finden Sie in der Anleitung zum Schreiben und Aufrufen von Logs.
Beispiele
Beispiele für die Verwendung der gebündelten Legacy-Dienste mit PHP finden Sie in den Codebeispielen.