Die PHP-Laufzeit ist das Softwarepaket, das für die Installation des Codes Ihres Webdienstes und der Abhängigkeiten sowie für die Ausführung Ihres Dienstes verantwortlich ist.
Zur Angabe von PHP für die App Engine-Standardumgebung deklarieren Sie die Laufzeit in der Datei app.yaml. Beispiele:
runtime: phpVERSION
Dabei ist VERSION die PHP-Versionsnummern MAJOR und MINOR. Wenn Sie beispielsweise die aktuelle PHP-Version (PHP 8.4) verwenden möchten, geben Sie 84 an.
Informationen zu anderen unterstützten PHP-Versionen und zur entsprechenden Ubuntu-Version für Ihre PHP-Version finden Sie im Zeitplan für den Laufzeitsupport. Beispiel: .
PHP-Version
Die neueste unterstützte PHP-Version ist 8.4. Die PHP-Laufzeit verwendet den neuesten stabilen Release der Version, die in der Datei app.yaml angegeben ist. App Engine wird automatisch auf neue Patchrelease-Versionen aktualisiert. Die Nebenversion wird jedoch nicht automatisch aktualisiert.
Beispiel: Eine mit PHP 7.3.0 bereitgestellte Anwendung wird später automatisch auf Version 7.3.1 aktualisiert, aber nicht auf PHP 7.4.0.
Appstart
Zur Verarbeitung von sämtlichem Anfragerouting muss ein Front-Controller bereitgestellt werden.
Die folgenden Beispiele zeigen verschiedene Möglichkeiten, wie Sie Ihre Anwendung bereitstellen können:
Wenn Ihre Anwendung eine
public/index.php- oderindex.php-Datei enthält, verwendet App Engine diese Datei zur Bereitstellung Ihrer Anwendung.Wir empfehlen einen Framework wie Laravel, Symfony oder Slim zu verwenden, da sie einfache Routings bieten, um PHP-Anwendungen schnell zu schreiben und bereitzustellen. Unter Front-Controller mit Slim finden Sie ein Beispiel.
Wenn Sie jedoch eine Legacy-Anwendung migrieren, sehen Sie sich die folgende Beispieldatei
index.phpan, um die benötigten PHP-Dateien zu importieren und den Front-Controller manuell zu implementieren:Wenn Sie das optionale Feld
entrypointin Ihrerapp.yaml-Datei verwenden, verwendet App Engine den Befehl imentrypoint-Element, um Ihre App bereitzustellen, und nichtpublic/index.phpoderindex.php:entrypoint: serve path/to/my/front/controller.phpDas Feld
entrypointverwendet den integrierten Befehlserve. Dieser ist ein Programm innerhalb der PHP-Laufzeit, das diephp-fpm-Implementierung und einen Webserver im Hintergrund startet. Der Webserver leitet den gesamten Traffic mithilfe des Designmusters des Front-Controllers an die bereitgestellte PHP-Datei weiter.Der Befehl
serveserve hat zwei optionale Flags:--workers=N: Gibt die Anzahl N derphp-fpm-Worker an. Wenn Sie das Flag--workersnicht festlegen, wird die Anzahl der Worker vom Befehlserveanhand der verfügbaren Speichermenge geschätzt. Die besten Ergebnisse erzielen Sie, wenn Sie für die Werte des Flags--workersim Befehlserveund im Elementmax_concurrent_requestsdie gleiche Zahl festlegen.--enable-dynamic-workers: Gibt an, dass diephp-fpm-Worker nur bei Bedarf erzeugt werden sollen. Standardmäßig wird für diephp-fpm-Worker eine statische Richtlinie verwendet. Mit dem Flag--workers=Nkönnen Sie die maximale Anzahl von erstellten Workern ändern. Standardmäßig entspricht die maximale Anzahl von erstellten Workern der in der statischen Richtlinie festgelegten Anzahl.
Die optionalen Flags müssen vor dem Pfad des Front-Controllers stehen:
entrypoint: serve --workers=2 --enable-dynamic-workers path/to/index.phpWenn Sie einen lang andauernden Worker-Prozess bereitstellen möchten, geben Sie bei dem Element
entrypointden Dateipfad des Worker-Prozesses an:entrypoint: php long-running-worker-file.phpVerwenden Sie nicht den Befehl
serve, wenn von dem Elemententrypointein Skript mit lang andauerndem Prozess wie ein Pub/Sub-Worker mit abonniertem Thema ausgeführt wird.
Weitere Informationen finden Sie in der app.yaml-Referenz.
Aktivierte Erweiterungen
Die folgenden Erweiterungen wurden in der PHP-Laufzeit für App Engine aktiviert:
BCMathbz2CalendarcorecgictypecURLdatedbadomenchantExiffcgifileinfofilterFTPGDgettextGMPhashiconvintljsonLDAPlibxmlmbstringMYSQLimysqlndMySQL (PDO)OPcacheOpenSSLPCNTLpcrePDOpgsqlPharposixPostgreSQL (PDO)ReflectionsessionShmopSimpleXMLSOAPSocketssodium (PHP 8.x only, not available for PHP 7.x)SPLSQLite (PDO)SQLite3standardtesttidytokenizerXMLXMLreaderXMLrpc (PHP 7.x only, not available for PHP 8.x)XMLwriterXSLzendZipZlib
Dynamisch ladbare Erweiterungen
Die folgenden Erweiterungen können durch entsprechende Konfiguration von php.ini dynamisch geladen werden:
Fügen Sie zum Aktivieren dieser Erweiterungen in der Datei php.ini unter extension Anweisungen hinzu. Zum Beispiel:
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
Umgebungsvariablen
Folgende Umgebungsvariablen werden durch die Laufzeit festgelegt:
| Umgebungsvariable | Beschreibung |
|---|---|
GAE_APPLICATION
|
ID der App Engine-Anwendung. Diese ID hat das Präfix „region code~”, z. B. „e~” für Anwendungen, die in Europa bereitgestellt werden. |
GAE_DEPLOYMENT_ID |
ID der aktuellen Bereitstellung. |
GAE_ENV |
App Engine-Umgebung. Legen Sie standard fest. |
GAE_INSTANCE |
ID der Instanz, auf der Ihr Dienst gerade ausgeführt wird. |
GAE_MEMORY_MB |
Größe des für den Anwendungsprozess verfügbaren Speichers in MB |
GAE_RUNTIME |
Laufzeit, die in der Datei app.yaml angegeben ist. |
GAE_SERVICE |
Dienstname, der in der Datei app.yaml angegeben ist. Wenn kein Dienstname angegeben ist, wird als Wert default festgelegt. |
GAE_VERSION |
Aktuelle Versionsbezeichnung Ihres Dienstes. |
GOOGLE_CLOUD_PROJECT |
Die Google Cloud Projekt-ID, die Ihrer Anwendung zugeordnet ist. |
PORT |
Port, der HTTP-Anfragen empfängt. |
NODE_ENV (nur in der Node.js-Laufzeit verfügbar) |
Erhält den Wert production, wenn der Dienst bereitgestellt wird. |
Sie können in der Datei app.yaml weitere Umgebungsvariablen definieren. Die oben angegebenen Werte können aber mit Ausnahme von NODE_ENV nicht überschrieben werden.
HTTPS und Weiterleitungsproxys
App Engine terminiert HTTPS-Verbindungen am Load-Balancer und leitet Anfragen an die Anwendung weiter. Einige Anwendungen müssen die ursprüngliche Anfrage-IP-Adresse und das Protokoll bestimmen. Die IP-Adresse des Nutzers ist im Standardheader X-Forwarded-For verfügbar. Bei Anwendungen, die diese Informationen benötigen, sollte das Web-Framework so konfiguriert werden, dass dem Proxy vertraut wird.
Dateisystem
Die Laufzeit enthält das beschreibbare Verzeichnis /tmp. Alle anderen Verzeichnisse sind schreibgeschützt. Beim Schreiben in /tmp wird Systemspeicher belegt. Weitere Informationen finden Sie unter tempnam()- und sys_get_temp_dir()-Support.
Metadatenserver
Jede Instanz einer Anwendung kann mit dem App Engine-Metadatenserver Informationen über die Instanz und das Projekt abfragen.
Sie können auf den Metadatenserver über die folgenden Endpunkte zugreifen:
http://metadatahttp://metadata.google.internal
An den Metadatenserver gesendete Anfragen müssen den Anfrageheader Metadata-Flavor: Google enthalten. Dieser Header gibt an, dass die Anfrage zum Abrufen von Metadatenwerten gesendet wurde.
In der folgenden Tabelle sind die Endpunkte aufgeführt, an die Sie HTTP-Anfragen für bestimmte Metadaten senden können:
| Metadatenendpunkt | Beschreibung |
|---|---|
/computeMetadata/v1/project/numeric-project-id |
Projektnummer, die Ihrem Projekt zugewiesen ist. |
/computeMetadata/v1/project/project-id |
Projekt-ID, die Ihrem Projekt zugewiesen ist. |
/computeMetadata/v1/instance/region |
Region, in der die Instanz ausgeführt wird. |
/computeMetadata/v1/instance/service-accounts/default/aliases |
|
/computeMetadata/v1/instance/service-accounts/default/email |
E-Mail-Adresse des Standarddienstkontos, die Ihrem Projekt zugewiesen ist. |
/computeMetadata/v1/instance/service-accounts/default/ |
Listet alle Standarddienstkonten für Ihr Projekt auf. |
/computeMetadata/v1/instance/service-accounts/default/scopes |
Listet alle unterstützten Bereiche für die Standarddienstkonten auf. |
/computeMetadata/v1/instance/service-accounts/default/token |
Gibt das Authentifizierungstoken zurück, mit dem Ihre Anwendung gegenüber anderen Google Cloud APIs authentifiziert werden kann. |
Wenn Sie z. B. Ihre Projekt-ID abrufen möchten, senden Sie eine Anfrage an http://metadata.google.internal/computeMetadata/v1/project/project-id.
Nachfolgend ist ein Beispiel für das Aufrufen der Metadatenendpunkte mithilfe von cURL oder der Google Cloud-Clientbibliothek:
Sitzungen
PHP bietet eine Sitzungsverwaltungsebene, mit der Webanwendungen Informationen zum Nutzerstatus zwischen Anfragen speichern können. Sitzungen in App Engine laufen weitgehend wie Sitzungen in anderen PHP-Anwendungen ab.
Mit dem folgenden Code können Sie in der Sitzung eines Nutzers eine Variable festlegen:
session_start();
$_SESSION['Foo'] = 'Bar';
Mit dem folgenden Code wird auf eine weitere Anfrage desselben Nutzers Bar ausgegeben:
session_start();
print $_SESSION['Foo']; // prints Bar
Bei längeren Sitzungen sollten Sie einen alternativen Speicherdienst wie Cloud SQL verwenden.
Spezielle $_SERVER-Schlüssel
Mit PHP wird das spezielle Array $_SERVER[] im Bereich von Anfragen verfügbar. Neben den Standard-CGI-Parametern ergänzt App Engine einige weitere nützliche Schlüssel:
GAE_APPLICATION: Die Google Cloud Projekt-ID der aktuellen App.GAE_DEPLOYMENT_ID: Quellcode-IDGAE_ENV: App Engine-Standardumgebung oder flexible App Engine-Umgebung, in der die Anwendung ausgeführt wirdGAE_INSTANCE: Name der aktuell ausgeführten InstanzGAE_MEMORY_MB: Menge des für den Anwendungsprozess verfügbaren Speichers in MBGAE_RUNTIME: Die in Ihrerapp.yaml-Datei angegebene Laufzeit, z. B. php72GAE_SERVICE: Name des aktuell bereitgestellten DienstesGAE_VERSION: Name der aktuell bereitgestellten VersionGOOGLE_CLOUD_PROJECT– Google Cloud Projekt-ID.HTTP_X_APPENGINE_CITY: Name der Stadt, aus der die Anfrage stammt So kann z. B. eine Anfrage aus der Stadt Mountain View den Header-Wert "mountain view" enthalten.HTTP_X_APPENGINE_CITYLATLONG: Breiten- und Längengrad der Stadt, von der die Anfrage stammt. Für eine Anfrage aus Mountain View kann dieser String etwa "37.386051,-122.083851" lauten.HTTP_X_APPENGINE_COUNTRY: Das Land, aus dem die Anfrage stammt, als Ländercode gemäß ISO 3166-1 Alpha-2. App Engine ermittelt diesen Code anhand der IP-Adresse des Clients.HTTP_X_APPENGINE_HTTPS: Bestätigt die HTTPS-NutzungHTTP_X_APPENGINE_REGION: Name der Region, aus der die Anfrage stammt. Die Interpretation dieses Werts hängt von dem unterX-Appengine-Countryangegebenen Land ab. Wenn als Land z. B. "US" und als Region "ca" festgelegt ist, steht "ca" für "Kalifornien", nicht für "Kanada".HTTP_X_APPENGINE_USER_IP: IP-Adresse des Clients Beachten Sie, dass$_SERVER['HTTP_X_APPENGINE_USER_IP']die einzige Möglichkeit ist, die IP-Adresse des Clients von Ihrer Anwendung abzurufen. Die Variable$_SERVER['REMOTE_ADDR']ist in App Engine nicht verfügbar.
Anweisungen mit neuen Initialisierungsstandards
In der folgenden Tabelle sind die Anweisungen aufgeführt, deren standardmäßigen Initialisierungswerte von den Anweisungen des PHP-Standardinterpreters abweichen, der über php.net verfügbar ist. Die Standardwerte für Anweisungen, die nicht in der folgenden Tabelle angegeben sind, finden Sie unter php.ini-Anweisungen.
| Anweisung | Standardwert in 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 |
Sie können diese Standardanweisungen überschreiben, indem Sie diese in eine php.ini-Datei für Ihre Anwendung einschließen.
Unterstützung für tempnam() und sys_get_temp_dir()
App Engine-Anwendungen werden in einer Sicherheits-Sandbox ausgeführt, in der nur das Verzeichnis /tmp beschreibbar ist und im RAM der Instanz gespeichert wird. Die App Engine-Version von tempnam() gibt daher eine speicherinterne temporäre Datei zurück, die in eine permanente Speicherlösung wie Cloud Storage-Buckets geschrieben werden kann.
Das folgende Beispiel zeigt, wie Sie mithilfe von file_put_contents() und fwrite() in die speicherinterne temporäre Datei schreiben.
<?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);
Die erwartete Ausgabe des Beispiels ist:
hello world
Abhängigkeiten mit Composer verwalten
Weitere Informationen finden Sie auf der Seite Abhängigkeiten angeben.