Migrer de la version v2.8 à v2.9¶
Introduction¶
La version 2.9 du framework apporte deux nouveautés : le déploiement de l'application sur un serveur (Debian ou Ubuntu) avec la commande make:deploy, et le flamegraph intégré au profiler de code. \
Elle est rétro-compatible : votre application fonctionne après la mise à jour du framework, sans modifier votre code (lisez toutefois le changement du chargement des variables d'environnement). Les autres étapes de cette page préparent votre projet au déploiement et aux nouveaux fichiers Docker.
Lien sur les release notes : v2.9
La version de PHP ne change pas
Comme la v2.8, la v2.9 nécessite PHP 8.4 minimum. Si votre projet fonctionne en v2.8, votre version de PHP convient.
Vous venez d'une version plus ancienne ?
Faites d'abord la migration de la version 2.3 à la version 2.8, puis suivez cette page.
Comment migrer ?¶
Pour migrer de la version 2.8 à la version 2.9, vous devez suivre les étapes suivantes :
- Analyser les changements : lisez les sections Les changements et Les nouveautés pour comprendre leur impact sur votre projet.
- Versionner votre travail : faites un commit avant de commencer, pour pouvoir revenir en arrière (
git statusne doit rien afficher). La base de données n'est pas modifiée par cette migration. - Faire les actions suivantes :
3.1 Mettre à jour le framework :
Résultat :
[...]
Package operations: 0 installs, 1 update, 0 removals
- Upgrading studoo/edu-framework (dev-main xxxxxxx => dev-main yyyyyyy): Extracting archive
[...]
Les identifiants de commit xxxxxxx et yyyyyyy varient : la version installée se vérifie à l'étape 3.5.
3.2 Mettre à jour les fichiers Docker :
La v2.9 découpe le Dockerfile en trois étapes (stages) : une image de développement, identique à celle de la v2.8, et une image de production, utilisée pour le déploiement. L'image de production a besoin de deux nouveaux fichiers : docker-entrypoint.sh et .dockerignore.
Copiez les trois fichiers depuis le framework installé par Composer à l'étape 3.1 (sous Windows, dans un terminal git bash) :
cp vendor/studoo/edu-framework/Dockerfile vendor/studoo/edu-framework/docker-entrypoint.sh vendor/studoo/edu-framework/.dockerignore .
Vous avez personnalisé votre Dockerfile ?
La copie remplace votre Dockerfile. Retrouvez l'ancienne version, enregistrée par le commit de l'étape 2, avec git show HEAD:Dockerfile, puis reportez vos modifications dans le stage frankenphp_base (extensions et paquets communs aux deux images) ou dans le stage frankenphp_dev (outils de développement uniquement). Le nom du stage frankenphp_prod ne doit pas changer : FrankenDeploy construit l'image avec ce nom.
Dans le fichier compose.yaml, le service frankenphp doit construire l'image de développement et transmettre l'argument EDU_PROFILER (profiler de code). Dans les projets créés avec le skeleton, il contient la forme courte build: . sur une seule ligne : remplacez-la entièrement par le bloc build: ci-dessous, au même niveau d'indentation que container_name:.
frankenphp:
container_name: ${APP_NAME}-http-server
-- build: .
++ build:
++ context: .
++ # Stage de développement du Dockerfile (frankenphp_prod sert au déploiement)
++ target: frankenphp_dev
++ args:
++ EDU_PROFILER: ${EDU_PROFILER_BUILD:-1}
N'ajoutez pas de lignes sous build: .
target et args ne peuvent pas être ajoutés sous la forme courte build: . : Docker Compose refuse le fichier (did not find expected key). Si votre clé build: contient déjà context et args, ajoutez seulement la ligne target. Sans le bloc args, la variable EDU_PROFILER_BUILD du .env est sans effet.
Reconstruisez l'image de développement si vous utilisez le flux 100 % Docker :
3.3 Mettre à jour le fichier .gitignore :
Le fichier composer.lock doit maintenant être versionné : l'image de production installe exactement les versions qu'il contient, et FrankenDeploy n'envoie au serveur que les fichiers suivis par git. Supprimez la ligne composer.lock du .gitignore.
La v2.9 lit aussi le fichier .env.local, qui contient les secrets de production : il ne doit jamais être versionné. Vérifiez que les lignes .env.local et .env.*.local sont présentes (c'est déjà le cas dans les projets créés avec le skeleton), et ajoutez-les si elles manquent.
Puis ajoutez le fichier composer.lock au dépôt :
3.4 Fixer les fins de ligne des scripts shell (Windows) :
Le conteneur de production ne démarre pas
Sous Windows, git peut convertir les fins de ligne du fichier docker-entrypoint.sh au format Windows (CRLF). Le conteneur de production refuse alors de démarrer avec l'erreur exec /usr/local/bin/docker-entrypoint: no such file or directory.
Créez le fichier .gitattributes à la racine du projet, pour que git conserve toujours les fins de ligne Linux (LF) des scripts shell :
Puis normalisez les fichiers déjà présents :
Cette étape est sans effet sous macOS et Linux, mais protège les membres de l'équipe qui travaillent sous Windows.
3.5 Vider le cache et vérifier la version :
Résultat :
La nouvelle commande make:deploy apparaît dans la liste des commandes :
Enfin, versionnez la migration :
git add Dockerfile docker-entrypoint.sh .dockerignore compose.yaml
git commit -m "Migration vers Edu-Framework v2.9"
Les changements¶
Le chargement des variables d'environnement¶
Les variables d'environnement sont maintenant chargées par la méthode ConfigCore::loadEnv(), utilisée par l'application (public/index.php) et par la commande bin/edu. Elles sont lues dans cet ordre (la première valeur trouvée est conservée) :
| Priorité | Source | Usage |
|---|---|---|
| 1 | variables d'environnement du processus (Docker, shell) | APP_ENV, DATABASE_URL en production |
| 2 | fichier .env.local (nouveau) |
secrets de production, jamais versionné |
| 3 | fichier .env |
configuration de développement |
Conséquences pour votre projet :
- les fichiers
.envet.env.localsont optionnels : l'application etbin/edudémarrent sans eux (en production, l'image Docker ne contient pas de.env) ; - une variable définie dans votre terminal ou par Docker remplace celle du
.env(Exemple :APP_ENV=prod php bin/edu startdémarre en mode production) ; - avec
php bin/edu start, les variables du.envet du.env.localsont lues au démarrage et transmises au serveur PHP : après une modification de ces fichiers, arrêtez le serveur (Ctrl+C) puis relancezphp bin/edu start(en v2.8, la modification était prise en compte dès la requête suivante) ; ConfigCore::getEnv()renvoie une chaîne vide pour une variable absente, sans avertissement PHP. UtilisezConfigCore::existEnv()pour savoir si une variable est définie.
La variable DATABASE_URL
Si la variable DATABASE_URL est définie (format mysql://utilisateur:motdepasse@hote:3306/base), le framework en déduit les variables DB_HOST_STATUS, DB_TYPE, DB_HOST, DB_SOCKET, DB_USER, DB_PASSWORD et DB_NAME qui ne sont pas déjà définies. Les variables DB_* de votre .env restent donc prioritaires.
Une DATABASE_URL MySQL, MariaDB ou PostgreSQL mal formée arrête l'application avec le message « La variable DATABASE_URL est invalide ». Une DATABASE_URL d'un autre type (Exemple : sqlite:///... d'un projet Symfony) est ignorée.
La commande bin/edu¶
bin/edu charge les variables d'environnement même sans fichier .env. Si DB_HOST_STATUS=true est défini (dans le .env, le .env.local ou l'environnement), la commande se connecte à la base de données au démarrage, comme en v2.8 : la base doit donc être démarrée.
Le Dockerfile multi-stage¶
Le Dockerfile contient maintenant trois étapes :
| Stage | Usage |
|---|---|
frankenphp_base |
socle commun : PHP 8.4, extensions, Composer |
frankenphp_prod |
production : utilisé par FrankenDeploy (voir Déployer son application) |
frankenphp_dev |
développement : utilisé par compose.yaml, identique à l'image v2.8 |
L'image de développement ne change pas : le flux 100 % Docker et les commandes docker compose restent identiques.
Les nouveautés¶
Déployer son application (v2.9)¶
La commande php bin/edu make:deploy génère le fichier frankendeploy.yaml, qui décrit le déploiement de l'application sur un serveur Debian ou Ubuntu avec FrankenDeploy : HTTPS automatique, base de données MariaDB gérée, mise à jour sans coupure de service et retour à la version précédente.
Pour plus de détails, consulter la page Déployer son application.
Le flamegraph intégré au profiler (v2.9)¶
L'onglet Code du profiler affiche le profil d'une requête sans fichier à télécharger, avec trois nouvelles vues :
- Flamegraph : les appels regroupés, le plus coûteux à gauche ;
- Chronologique : l'ordre des appels, avec un axe du temps ;
- Comparer : le flamegraph différentiel de deux requêtes profilées (en rouge ce qui est plus lent, en bleu ce qui est plus rapide).
Le bloc Code de la barre de debug affiche aussi un mini-flamegraph : un clic l'ouvre en grand dans le profiler.
Pour plus de détails, consulter les sections Le flamegraph intégré et Comparer deux requêtes.