L'environnement d'exécution PHP est la pile logicielle chargée d'installer le code de votre service Web et ses dépendances, et d'exécuter votre service.
Pour spécifier PHP pour l'environnement standard App Engine, déclarez l'environnement d'exécution dans le fichier app.yaml
. Exemple :
runtime: phpVERSION
Où VERSION correspond aux numéros de version PHP MAJOR
et MINOR
. Par exemple, pour utiliser la dernière version de PHP, PHP 8.3, spécifiez 83
.
Pour les autres versions de PHP compatibles, ainsi que pour la version d'Ubuntu correspondante pour votre version de PHP, consultez la page Calendrier de compatibilité des environnements d'exécution.
Version de PHP
L'environnement d'exécution PHP utilise la dernière version stable de la version spécifiée dans le fichier app.yaml
. App Engine se met automatiquement à jour en cas de nouvelle version corrective, mais pas en cas de nouvelle version mineure.
Par exemple, l'application peut être déployée sur PHP 7.3.0 et faire ultérieurement l'objet d'une mise à jour automatique vers la version 7.3.1, mais elle ne sera pas automatiquement mise à jour vers PHP 7.4.0.
Démarrage de l'application
Vous devrez déployer un contrôleur frontal pour gérer le routage de toutes les requêtes.
Les exemples suivants présentent différentes manières de diffuser votre application :
Si votre application contient un fichier
public/index.php
ouindex.php
, App Engine utilise ce fichier pour diffuser l'application.Nous vous recommandons d'utiliser un framework, tel que Laravel, Symfony ou Slim, car il fournit un routage léger pour l'écriture et le déploiement rapide d'applications PHP. Consultez un exemple de contrôleur frontal Slim.
Toutefois, si vous migrez une ancienne application, consultez l'exemple de fichier
index.php
suivant pour importer les fichiers PHP dont vous avez besoin et mettre en œuvre le contrôleur frontal manuellement :Si vous spécifiez l'élément
entrypoint
facultatif dans votre fichierapp.yaml
, App Engine utilise la commande de l'élémententrypoint
pour diffuser votre application à la place depublic/index.php
ouindex.php
:entrypoint: serve path/to/my/front/controller.php
Le champ
entrypoint
utilise la commandeserve
intégrée, qui est un programme de l'environnement d'exécution PHP. Ce programme commence l'implémentation dephp-fpm
et démarre un serveur Web en arrière-plan. Ce serveur Web achemine tout le trafic vers le fichier PHP fourni en utilisant le modèle de conception du contrôleur frontal.La commande
serve
comporte deux options facultatives :--workers=N
: spécifie le nombre N de nœuds de calculphp-fpm
. Si vous ne définissez pas l'option--workers
, la commandeserve
devine le nombre de nœuds de calcul en fonction de la quantité de mémoire disponible. Pour de meilleurs résultats, définissez les valeurs de l'option--workers
de la commandeserve
et de l'élémentmax_concurrent_requests
sur le même nombre.--enable-dynamic-workers
: indique que vous souhaitez que les nœuds de calculphp-fpm
soient générés uniquement en fonction des besoins. Une règle statique est utilisée par défaut pour les nœuds de calculphp-fpm
. Vous pouvez modifier le nombre maximal de nœuds de calcul générés à l'aide de l'option--workers=N
. Par défaut, le nombre maximal de nœuds de calcul générés correspond à celui défini par la stratégie statique.
Les options facultatives doivent se situer avant le chemin d'accès au contrôleur frontal :
entrypoint: serve --workers=2 --enable-dynamic-workers path/to/index.php
Vous pouvez déployer un processus de nœud de calcul de longue durée en définissant l'élément
entrypoint
dans le chemin de fichier du processus de nœud de calcul :entrypoint: php long-running-worker-file.php
Si l'élément
entrypoint
exécute un script avec un processus de longue durée, tel qu'un nœud de calcul Pub/Sub abonné à un sujet, n'utilisez pas la commandeserve
.
Pour en savoir plus, consultez la documentation de référence sur app.yaml
.
Extensions activées
Les extensions suivantes ont été activées dans l'environnement d'exécution PHP pour App Engine :
BCMath
bz2
Calendar
core
cgi
ctype
cURL
date
dba
dom
enchant
Exif
fcgi
fileinfo
filter
FTP
GD
gettext
GMP
hash
iconv
intl
json
LDAP
libxml
mbstring
MYSQLi
mysqlnd
MySQL (PDO)
OPcache
OpenSSL
PCNTL
pcre
PDO
pgsql
Phar
posix
PostgreSQL (PDO)
Reflection
session
Shmop
SimpleXML
SOAP
Sockets
sodium (PHP 8.x only, not available for PHP 7.x)
SPL
SQLite (PDO)
SQLite3
standard
test
tidy
tokenizer
XML
XMLreader
XMLrpc (PHP 7.x only, not available for PHP 8.x)
XMLwriter
XSL
zend
Zip
Zlib
Extensions à chargement dynamique
Les extensions suivantes peuvent être chargées dynamiquement via la configuration du fichier php.ini
:
Pour activer ces extensions, ajoutez-leur des instructions dans votre fichier php.ini
sous extension
, comme suit :
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
Variables d'environnement
Les variables d'environnement suivantes sont définies par l'environnement d'exécution :
Variable d'environnement | Description |
---|---|
GAE_APPLICATION
|
ID de votre application App Engine. Cet ID est précédé du préfixe "region code~", tel que "e~" pour les applications déployées en Europe. |
GAE_DEPLOYMENT_ID |
ID du déploiement actuel. |
GAE_ENV |
Environnement App Engine. Variable définie sur standard . |
GAE_INSTANCE |
ID de l'instance sur laquelle votre service est en cours d'exécution. |
GAE_MEMORY_MB |
Quantité de mémoire disponible pour le processus d'application, en Mo. |
GAE_RUNTIME |
Environnement d'exécution spécifié dans le fichier app.yaml . |
GAE_SERVICE |
Nom de service spécifié dans le fichier app.yaml . Si aucun nom de service n'est spécifié, il est défini par défaut sur default . |
GAE_VERSION |
Libellé de la version actuelle du service. |
GOOGLE_CLOUD_PROJECT |
ID du projet Google Cloud associé à votre application. |
PORT |
Port qui reçoit les requêtes HTTP. |
NODE_ENV (disponible uniquement dans l'environnement d'exécution Node.js) |
Variable définie sur production lorsque votre service est déployé. |
Vous pouvez définir des variables d'environnement supplémentaires dans le fichier app.yaml
, mais les valeurs ci-dessus ne peuvent pas être remplacées, sauf NODE_ENV
.
HTTPS et proxy de transfert
App Engine met fin aux connexions HTTPS au niveau de l'équilibreur de charge et transfère les requêtes à votre application. Certaines applications doivent déterminer l'adresse IP et le protocole de la requête d'origine. L'adresse IP de l'utilisateur est disponible dans l'en-tête standard X-Forwarded-For
. Les applications nécessitant ces informations doivent configurer leur framework Web pour qu'il fasse confiance au proxy.
Système de fichiers
L'environnement d'exécution comprend un répertoire /tmp
accessible en écriture, tous les autres répertoires ayant un accès en lecture seule. Le fait d'écrire des données dans /tmp
utilise la mémoire système. Pour en savoir plus, consultez la section Disponibilité de tempnam()
et sys_get_temp_dir()
.
Serveur de métadonnées
Chaque instance de votre application peut demander des informations sur l'instance et votre projet à l'aide du serveur de métadonnées App Engine.
Vous pouvez accéder au serveur de métadonnées via les points de terminaison suivants :
http://metadata
http://metadata.google.internal
Les requêtes envoyées au serveur de métadonnées doivent inclure l'en-tête de requête Metadata-Flavor: Google
. Cet en-tête indique que la requête a été envoyée dans le but de récupérer les valeurs de métadonnées.
La table suivante répertorie les points de terminaison sur lesquels vous pouvez effectuer des requêtes HTTP pour des métadonnées spécifiques :
Point de terminaison des métadonnées | Description |
---|---|
/computeMetadata/v1/project/numeric-project-id |
Numéro de projet attribué à votre projet. |
/computeMetadata/v1/project/project-id |
ID de projet attribué à votre projet. |
/computeMetadata/v1/instance/region |
Région dans laquelle l'instance est en cours d'exécution. |
/computeMetadata/v1/instance/service-accounts/default/aliases |
|
/computeMetadata/v1/instance/service-accounts/default/email |
Adresse e-mail du compte de service par défaut attribué à votre projet. |
/computeMetadata/v1/instance/service-accounts/default/ |
Répertorie tous les comptes de service par défaut pour votre projet. |
/computeMetadata/v1/instance/service-accounts/default/scopes |
Répertorie tous les champs d'application disponibles pour les comptes de service par défaut. |
/computeMetadata/v1/instance/service-accounts/default/token |
Renvoie le jeton d'authentification pouvant servir à authentifier votre application auprès d'autres API Google Cloud. |
Par exemple, pour récupérer votre ID de projet, envoyez une requête à http://metadata.google.internal/computeMetadata/v1/project/project-id
.
Vous trouverez ci-dessous un exemple décrivant comment appeler les points de terminaison des métadonnées à l'aide de cURL ou de la bibliothèque cliente Google Cloud :
Sessions
PHP propose une couche de gestion des sessions qui permet aux applications Web de préserver les informations relatives à l'état d'un compte utilisateur entre les requêtes. Les sessions au sein d'App Engine fonctionnent comme des sessions dans toute autre application PHP.
Pour définir une variable dans une session utilisateur, vous pouvez utiliser le code suivant :
session_start();
$_SESSION['Foo'] = 'Bar';
Le code suivant imprimera Bar
lors d'une requête ultérieure par le même utilisateur :
session_start();
print $_SESSION['Foo']; // prints Bar
Pour les sessions plus longues, utilisez un autre service de stockage tel que Cloud SQL.
Clés $_SERVER spéciales
PHP rend le tableau $_SERVER[]
spécial disponible dans le champ d'application de la requête. En plus des paramètres CGI standards, App Engine propose quelques clés supplémentaires utiles :
GAE_APPLICATION
: ID du projet Google Cloud de l'application actuelle.GAE_DEPLOYMENT_ID
: ID du code source déployé.GAE_ENV
: environnement App Engine (standard ou flexible) dans lequel votre application s'exécute.GAE_INSTANCE
: nom de l'instance en cours d'exécution.GAE_MEMORY_MB
: quantité de mémoire disponible pour le processus d'application, en Mo.GAE_RUNTIME
: environnement d'exécution spécifié dans le fichierapp.yaml
, tel que php72.GAE_SERVICE
: nom du service actuellement déployé.GAE_VERSION
: nom de la version actuellement déployée.GOOGLE_CLOUD_PROJECT
: ID du projet Google Cloud.HTTP_X_APPENGINE_CITY
: nom de la ville d'origine de la requête. Par exemple, la valeur d'en-tête d'une requête provenant de Mountain View serait "mountain view".HTTP_X_APPENGINE_CITYLATLONG
: latitude et longitude de la ville d'origine de la requête. Cette chaîne peut par exemple prendre la forme "37.386051, -122.083851" pour une requête provenant de Mountain View.HTTP_X_APPENGINE_COUNTRY
: pays d'origine de la requête, sous forme de code de pays ISO 3166-1 alpha-2. App Engine définit ce code à partir de l'adresse IP du client.HTTP_X_APPENGINE_HTTPS
: vérifie l'utilisation du protocole HTTPS.HTTP_X_APPENGINE_REGION
: nom de la région d'origine de la requête. Cette valeur n'a de sens que dans le contexte du pays dansX-Appengine-Country
. Par exemple, si le pays est "États-Unis" et la région est "ca", ce "ca" signifie "Californie", et non Canada.HTTP_X_APPENGINE_USER_IP
: adresse IP du client. Notez que$_SERVER['HTTP_X_APPENGINE_USER_IP']
est la seule manière permettant à votre application de récupérer l'adresse IP du client. La variable$_SERVER['REMOTE_ADDR']
n'est pas disponible dans App Engine.
Directives avec de nouveaux paramètres d'initialisation par défaut
Le tableau suivant spécifie les directives dont les valeurs d'initialisation par défaut diffèrent de celles fournies avec l'interpréteur PHP standard disponible sur php.net. Pour trouver les valeurs par défaut des directives non spécifiées dans le tableau suivant, reportez-vous aux directives php.ini.
Directive | Valeur par défaut dans 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 |
Remplacez ces instructions par défaut en les incluant dans un fichier php.ini
pour votre application.
Disponibilité de tempnam()
et sys_get_temp_dir()
Les applications App Engine s'exécutent dans un bac à sable de sécurité où seul le répertoire /tmp
est accessible en écriture et stocké dans la mémoire RAM de l'instance. Pour cette raison, la version de tempnam()
d'App Engine renvoie un fichier temporaire en mémoire pouvant être écrit ultérieurement sur une solution de stockage permanent, telle que les buckets Cloud Storage.
Voici un exemple d'écriture dans le fichier temporaire en mémoire à l'aide de file_put_contents()
et fwrite()
.
<?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);
Le résultat attendu de l'exemple serait le suivant :
hello world
Gérer des dépendances avec l'outil Composer
Pour en savoir plus, consultez la page Spécifier des dépendances.