PHP-Laufzeitumgebung

Die PHP-Laufzeit ist der Softwarestack, der für die Installation Ihres Anwendungscodes und der Abhängigkeiten sowie für die Ausführung dieser Anwendung in der flexiblen Umgebung verantwortlich ist.

PHP-Versionen

PHP 8.3 verwendet Buildpacks. Eine vollständige Liste der unterstützten PHP-Versionen und deren entsprechende Ubuntu-Version finden Sie im Zeitplan für den Laufzeitsupport.

So verwenden Sie eine unterstützte PHP-Version:

  • Installieren Sie die gcloud CLI-Version 420.0.0 oder höher. Sie können die Befehlszeilentools mit dem Befehl gcloud components update aktualisieren. Zum Aufrufen der installierten Version können Sie den Befehl gcloud version ausführen.

  • Fügen Sie die Einstellungen runtime_config und operating_system in die Datei app.yaml ein, um ein Betriebssystem anzugeben.

  • Deklarieren Sie den Dokumentenstamm für Ihre Anwendung in der Datei app.yaml:

      runtime: php
      env: flex
    
      runtime_config:
          operating_system: "ubuntu22"
          document_root: "web"
    

    Obwohl Sie das Stammverzeichnis des Projekts (.) als Dokumentstamm angeben können, empfehlen wir Ihnen, ein Unterverzeichnis für die Einstellung document_root zu verwenden.

    Der Quellcode befindet sich im Verzeichnis /workspace anstelle des Stammverzeichnisses (/). Wenn Sie eine Konfiguration überschreiben, verweisen die Prozesse NGINX oder supervisor auf Ihre Konfigurationsdatei in diesem Verzeichnis. Zum Aktualisieren der entsprechenden Referenzen müssen Sie Folgendes tun:

    • Aktualisieren Sie alle include-Anweisungen in Ihrer NGINX-Konfiguration relativ zu /workspace anstelle von /etc/nginx.

    • Einige Dateien, z. B. gzip_params, sind nicht enthalten. Wenn Sie auf diese Dateien verweisen möchten, fügen Sie Ihr eigenes Dokument hinzu oder kopieren Sie es aus GitHub. Dateien wie mime.types und fastcgi_params sind im Verzeichnis /etc/nginx verfügbar.

    • Einige NGINX-Module wie nginx-plus-module-ndk sind nicht installiert. Legen Sie den Wert $docroot fest oder fügen Sie den Wert manuell in der Konfigurationsdatei NGINX hinzu.

  • Optional können Sie eine Laufzeitversion so angeben:

    • Fügen Sie die Einstellung runtime_version in app.yaml ein. Standardmäßig wird die neueste PHP-Version verwendet, wenn die Einstellung runtime_version nicht angegeben ist.

      • So geben Sie PHP 8.3 auf Ubuntu 22 an:

        runtime: php
        env: flex
        
        runtime_config:
            operating_system: "ubuntu22"
            runtime_version: "8.3"
            document_root: .
        
      • So geben Sie die neueste unterstützte PHP-Version unter Ubuntu 22 an:

          runtime: php
          env: flex
        
          runtime_config:
              operating_system: "ubuntu22"
              document_root: .
        
    • PHP-Version in die Datei composer.json aufnehmen.

      {
          "require": {
              "php": "8.3.*"
          }
      }
      

    Weitere Informationen finden Sie in der Referenz app.yaml.

Vorherige Laufzeitversionen

Damit Sie PHP-Version 7.3 und früher verwenden können, müssen Sie:

  • Den Dokumentstamm für Ihre Anwendung deklarieren. Dies können Sie in der Datei app.yaml tun:

    runtime: php
    env: flex
    api_version: 1
    
    runtime_config:
      document_root: .
    

    Obwohl Sie das Stammverzeichnis des Projekts (.) als Dokumentstamm angeben können, empfehlen wir Ihnen, ein Unterverzeichnis für die Einstellung document_root zu verwenden.

  • Geben Sie in der Datei composer.json eine PHP-Version an, damit Ihre Anwendung nicht automatisch aktualisiert wird, wenn eine neue PHP-Version zur Verfügung steht.

    {
        "require": {
            "php": "7.3.*"
        }
    }
    

Unterstützung für andere PHP-Laufzeiten

Wenn Sie eine PHP-Version verwenden müssen, die nicht unterstützt wird, können Sie eine benutzerdefinierte Laufzeit erstellen und ein gültiges Basis-Image mit der von Ihnen benötigten PHP-Version auswählen.

Informationen zu von Google bereitgestellten Basis-Images oder Docker PHP-Basis-Images finden Sie unter Benutzerdefinierte Laufzeiten erstellen.

NGINX anpassen

Um eine benutzerdefinierte Konfigurationsdatei zu definieren, berücksichtigen Sie die Datei nginx-app.conf im Stammverzeichnis Ihres Projekts.

Standardmäßig verwendet der Framework-Front-Controller die Datei index.php. Möglicherweise müssen Sie dies für Ihr Projekt ändern. Beispielsweise verwendet das Symfony-Framework app.php anstelle von index.php. Sie können den Dateinamen im Abschnitt runtime_config der Datei app.yaml ändern:

runtime: php
env: flex

runtime_config:
operating_system: "ubuntu22"
document_root: .
front_controller_file: app.php

Bei Version 7.3 und früher ist die Konfigurationsdatei nginx-app.conf im Serverabschnitt der Hauptkonfigurationsdatei NGINX enthalten. Die Standardkonfigurationsdatei php-app.conf enthält beispielsweise Folgendes:

location / {
# try to serve files directly, fallback to the front controller
try_files $uri /$front_controller_file$is_args$args;
}

Um eine benutzerdefinierte Konfigurationsdatei zu definieren, erstellen Sie die Datei nginx-app.conf im Stammverzeichnis Ihres Projekts. Die Laufzeitumgebung überschreibt die Standarddatei mit der von Ihnen angegebenen Datei.

Standardmäßig verwendet der Framework-Front-Controller die Datei index.php. Möglicherweise müssen Sie dies für Ihr Projekt ändern. Beispielsweise verwendet das Symfony-Framework app.php anstelle von index.php. Sie können den Dateinamen im Abschnitt runtime_config der Datei app.yaml ändern:

runtime: php
env: flex

runtime_config:
document_root: .
front_controller_file: app.php

OPcache

Aktivieren Sie OPcache in Ihrer php.ini-Datei. Weitere Informationen zur Konfiguration von OPcache finden Sie in der offiziellen Dokumentation.

Erstellen oder bearbeiten Sie die Datei php.ini mit der folgenden Zeile, um OPcache zu deaktivieren:

opcache.enable=0

Abhängigkeiten

Die Laufzeit sucht im Quellverzeichnis der Anwendung nach der Datei composer.json und verwendet composer, um Abhängigkeiten zu installieren, bevor die Anwendung gestartet wird. Weitere Informationen zum Deklarieren und Verwalten von Paketen finden Sie unter PHP-Bibliotheken verwenden.

PHP-Erweiterungen

Die folgenden PHP-Erweiterungen sind auf dem System vorinstalliert und aktiviert:

Unterstützte PHP-Versionen

Sie können die folgenden Erweiterungen mit der Datei php.ini aktivieren:

v7.3 und älter

Die folgenden PHP-Erweiterungen sind standardmäßig deaktiviert. Sie können die folgenden Erweiterungen in der Datei php.ini aktivieren:

Zum Aktivieren einer Erweiterung fügen Sie im Stammverzeichnis Ihrer Anwendung die Datei php.ini mit der Anweisung extension hinzu:

; Enable the Redis extension
extension=redis.so

; Enable the OpenTelemetry extension (must be in an opentelemetry section)
[opentelemetry]
extension=opentelemetry.so

Alternativ können Sie eine Erweiterung auch aktivieren, indem Sie composer.json ein require hinzufügen:

{
    "require": {
        "ext-redis": "*"
    }
}

Diese Pakete lassen die Installation der gängigsten PHP-Erweiterungen zu. Wenn die Anwendung weitere Abhängigkeiten auf Betriebssystemebene erfordert, müssen Sie die PHP-Laufzeit erweitern oder eine benutzerdefinierte Laufzeit verwenden, um die entsprechenden Pakete zu installieren.

HTTPS- und Weiterleitungs-Proxys

App Engine beendet die HTTPS-Verbindung am Load-Balancer und leitet die Anfrage zu Ihrer Anwendung weiter. Der NGINX-Server ist so konfiguriert, dass die HTTPS-Umgebungsvariable ($_SERVER["HTTPS"]) auf on gesetzt wird, wenn die Anfrage über HTTPS erfolgt.

Einige Anwendungen müssen auch die IP-Adresse des Nutzers ermitteln. Diese Funktion ist im Standard-Header X-Forwarded-For verfügbar.

Deaktivierte Funktionen

Die folgenden Funktionen werden mit der Anweisung disable_functions in php.ini deaktiviert:

  • exec
  • passthru
  • proc_open
  • proc_close
  • shell_exec
  • show_source
  • symlink
  • system

Wenn Sie eine der oben genannten Funktionen benötigen, fügen Sie im Stammverzeichnis Ihrer Anwendung die Datei php.ini hinzu und ändern Sie die Anweisung disable_functions. Alternativ legen Sie whitelist_functions im Abschnitt runtime_config in der Datei app.yaml als eine durch Kommas getrennte Funktionsliste fest, um die Zulassung zu aktivieren.

In PHP-Version 7.3 und früher ist die Erweiterung Suhosin Securit standardmäßig installiert und für die Ausführung im Simulationsmodus konfiguriert. Der Simulationsmodus protokolliert die Verwendung potenziell gefährlicher Funktionen, die in der Cloud Logging-Benutzeroberfläche angezeigt werden. Wenn Sie den Simulationsmodus deaktivieren, wird Ihre Anwendung bei der Verwendung einer potenziell gefährlichen Funktion beendet. Zum Aktivieren dieser zusätzlichen Sicherheitsfunktion fügen Sie im Stammverzeichnis des Projekts php.ini mit der folgenden Option hinzu:

; Prevent the use of potentially dangerous functions rather than logging them
suhosin.simulation = Off

Gepatchte Funktionen

Die Funktion parse_str ist gepatcht und der zweite Parameter ist obligatorisch. Wenn Sie parse_str mit nur einem Parameter aufrufen, wird eine Warnung ausgegeben und die Funktion wird nicht aufgerufen.

Verfügbare Konfigurationen

Sie können die folgenden Konfigurationen im Abschnitt runtime_config einfügen:

NameBeschreibungStandardwert
document_root Legt DOCUMENT_ROOT für nginx und PHP fest. Sie müssen einen relativen Pfad zum Projektstammverzeichnis verwenden. Pflichtfeld
composer_flags Sie können mit diesem Schlüssel einige Composer-Flags überschreiben. --no-dev --prefer-dist
enable_stackdriver_integration Wird nur für Version 7.3 und früher unterstützt. Wenn dieser Wert auf "true" gesetzt ist, aktiviert die Laufzeit automatisch die Integration von Google Cloud Observability. Für diese Konfiguration ist das google/cloud-Paket ab v0.33 erforderlich. false
skip_lockdown_document_root Wird nur für Version 7.3 und früher unterstützt. Standardmäßig erteilt die Laufzeit für alle Dateien und Verzeichnisse im Verzeichnis document_root ausschließlich Leseberechtigungen. Wenn dafür true festgelegt wird, überspringt die Laufzeit die Änderung der Berechtigung. false
whitelist_functions Wird nur für Version 7.3 und früher unterstützt. Eine durch Kommas getrennte Liste der Funktionsnamen, die zugelassen werden sollen. Leerer String
front_controller_file Standard-PHP-Dateiname für den Verzeichniszugriff. index.php
nginx_conf_http_include Dateiname einer partiellen nginx-Konfiguration, die im Abschnitt http in der nginx-Hauptkonfigurationsdatei enthalten sein soll. nginx-http.conf
nginx_conf_include Dateiname einer partiellen nginx-Konfiguration, die im Abschnitt server in der nginx-Hauptkonfigurationsdatei enthalten sein soll. nginx-app.conf
nginx_conf_override Dateiname einer benutzerdefinierten nginx-Konfigurationsdatei, die als nginx-Hauptkonfigurationsdatei verwendet wird. nginx.conf
php_fpm_conf_override Dateiname einer vom Nutzer bereitgestellten php-fpm-Konfigurationsdatei, die unten im Abschnitt [app] eingefügt wird, um die vorhandenen Konfigurationen zu überschreiben. php-fpm.conf
php_ini_override Dateiname einer von einem Nutzer bereitgestellten PHP-Konfigurationsdatei. php.ini
supervisord_conf_addition Dateiname einer von einem Nutzer bereitgestellten supervisord-Konfigurationsdatei, die in der supervisord-Hauptkonfigurationsdatei enthalten ist. additional-supervisord.conf
supervisord_conf_override Dateiname einer von einem Nutzer bereitgestellten supervisord-Konfigurationsdatei, die die supervisord-Hauptkonfigurationsdatei überschreibt. supervisord.conf

supervisord in der PHP-Laufzeit konfigurieren

Die flexible App Engine-Umgebung nutzt supervisord für die Prozessverwaltung. Standardmäßig führt supervisord nginx und php-fpm aus, um PHP-Webanwendungen auszuführen. Einige Anwendungen müssen jedoch externe Prozesse ausführen. Außerdem brauchen solche Anwendungen manchmal nicht einmal nginx oder php-fpm.

Wenn Sie einen Prozess hinzufügen möchten, der von supervisord verwaltet wird, fügen Sie im Stammverzeichnis des Projekts eine Datei mit dem Namen additional-supervisord.conf hinzu. Der Inhalt dieser Konfigurationsdatei kann dann zum Beispiel so aussehen:

[program:quote-updater]
command = php %(ENV_APP_DIR)s/worker.php
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes=0
user = www-data
autostart = true
autorestart = true
priority = 5
stopwaitsecs = 20

Wenn Sie nginx und php-fpm durch Ihren Prozess ersetzen möchten, fügen Sie dem Stammverzeichnis des Projekts die Datei supervisord.conf hinzu. Der Inhalt dieser Konfigurationsdatei kann dann zum Beispiel so aussehen:

[supervisord]
nodaemon = true
logfile = /dev/null
logfile_maxbytes = 0
pidfile = /var/run/supervisord.pid

[program:react-server]
command = php %(ENV_APP_DIR)s/index.php
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes=0
user = www-data
autostart = true
autorestart = true
priority = 5
stopwaitsecs = 20

Laufzeit erweitern

Die flexible App Engine-Umgebung für PHP kann zum Erstellen einer benutzerdefinierten Laufzeit verwendet werden. Weitere Informationen finden Sie unter PHP-Laufzeitumgebung anpassen.

Umgebungsvariablen

Die folgenden Umgebungsvariablen werden durch die Laufzeitumgebung festgelegt:

Umgebungsvariable Beschreibung
GAE_INSTANCE Der Name der aktuellen Instanz
GAE_MEMORY_MB Die Größe des für den Anwendungsprozess verfügbaren Speichers
GAE_SERVICE Der in der Datei app.yaml Ihrer Anwendung angegebene Dienstname. Wenn kein Dienstname angegeben ist, wird als Wert default festgelegt.
GAE_VERSION Das Versionslabel der aktuellen Anwendung
GOOGLE_CLOUD_PROJECT Die mit Ihrer Anwendung verknüpfte Projekt-ID, die in der Google Cloud Console angezeigt wird
PORT Der Port, der HTTP-Anfragen empfängt

Sie können mit app.yaml noch weitere Umgebungsvariablen festlegen.

Metadatenserver

Jede Instanz Ihrer Anwendung kann den Compute Engine-Metadatenserver verwenden, um Informationen über die Instanz abzufragen, einschließlich ihres Hostnamens, ihrer externen IP-Adresse, Instanz-ID, benutzerdefinierten Metadaten und Dienstkontoinformationen. Sie können in App Engine nicht für jede einzelne Instanz benutzerdefinierte Metadaten festlegen. Sie haben aber die Möglichkeit, projektweite benutzerdefinierte Metadaten festzulegen und diese aus den App Engine- und Compute Engine-Instanzen zu lesen.

Diese Beispielfunktion ruft die externe IP-Adresse einer Instanz über den Metadatenserver ab:

function get_external_ip_using_google_cloud()
{
    $metadata = new Google\Cloud\Core\Compute\Metadata();
    $externalIp = $metadata->get(
        'instance/network-interfaces/0/access-configs/0/external-ip');

    return $externalIp;
}

function get_external_ip_using_curl()
{
    $url = 'http://metadata.google.internal/computeMetadata/v1/' .
        'instance/network-interfaces/0/access-configs/0/external-ip';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Metadata-Flavor: Google'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    return curl_exec($ch);
}