Auf gebündelte Legacy-Dienste für PHP 7+ zugreifen

Auf dieser Seite wird beschrieben, wie Sie die gebündelten Dienste mit der PHP 7/8-Laufzeit für die App Engine-Standardumgebung installieren und verwenden. Ihre Anwendung kann über das App Engine Services SDK für PHP 7/8 auf die gebündelten Dienste zugreifen.

Hinweis

  1. Weitere Informationen finden Sie in der Liste der gebündelten Legacy-Dienst-APIs, die Sie in der PHP 7/8-Laufzeit aufrufen können.

  2. Aktualisieren Sie die Datei app.yaml mit der folgenden Zeile:

    app_engine_apis: true
    
  3. Wenn Sie Ihre PHP 7/8-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:

  1. Führen Sie den Befehl Packagist aus, um das SDK zu Ihrer Datei composer.json hinzuzufügen:

    composer require google/appengine-php-sdk
    
  2. 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 7/8 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 7/8 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.

E-Mail

Die PHP 7/8 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 7/8 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 7/8.

E-Mail-Funktion

In PHP 5.5 war die native PHP-Funktion mail() mit der E-Mail-Funktion von App Engine überlastet.

In PHP 7/8 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 7/8 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 7/8-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 7/8:

use Google\AppEngine\Api\Memcache\Memcache;

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

Beispiel für die Memcached API für PHP 7/8:

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 7/8 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 7/8 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.

Session

PHP 7/8-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 7/8 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 7/8 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 7/8 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 7/8 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 7/8 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:

  1. Heben Sie die Registrierung des nativen PHP-Stream-Handlers für HTTP(S) mit stream_wrapper_unregister() auf.
  2. Registrieren Sie HTTP(S) mit stream_wrapper_register() in der Klasse UrlFetchStream.
  3. Rufen Sie file_get_contents() mit der Konfiguration auf, die Sie für den Stream-Wrapper verwenden möchten.

Vergleiche finden Sie in den entsprechenden Beispielen für PHP 5 und 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.

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:

  1. Heben Sie die Registrierung des nativen PHP-Stream-Handlers für HTTP(S) mit stream_wrapper_unregister() auf.
  2. Registrieren Sie HTTP(S) mithilfe von stream_wrapper_register() in der Klasse UrlFetchStream.
  3. Verwenden Sie fopen() anstelle von file_get_contents() mit der gewünschten Konfiguration.
  4. 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 7/8 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 7/8 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 7/8-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 7/8-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 Datei composer.phar fest.

  • Verwenden Sie zum Bereitstellen der Anwendung den Befehl gcloud app deploy.

  • Das Logging in der PHP 7/8-Laufzeit entspricht dem Logging-Standard in Cloud Logging. In der PHP 7/8-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.