Skip to content
Merged

2.8.0 #167

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
1083fa5
feat(debug-bar): ajout de l'alignement des colonnes et mise à jour de…
bfoujols Oct 17, 2026
464ddb0
feat(profiler): suppression des informations de résumé dans la sectio…
bfoujols Oct 17, 2026
cb8b19e
feat(profiler): profiler de code Excimer dans la barre de debug
claude Oct 20, 2026
9dd26a7
fix(profiler): ne plus masquer l'erreur de gzuncompress (PHP-W1078)
claude Oct 20, 2026
1229b75
test(debug-bar): aligner le test des services sur les liens sans prot…
claude Oct 20, 2026
f5f712c
fix(profiler): corrections de la review de la PR
claude Oct 20, 2026
15e4e32
docs(profiler): docblocks des méthodes des drivers et des tests (PHP-…
claude Oct 20, 2026
2b03820
docs: docblocks des méthodes et classes existantes sans commentaire (…
claude Oct 20, 2026
b5d7ba6
fix(profiler): corrections des alertes Codacy de la PR
claude Oct 20, 2026
64e01b1
test(profiler): driver factice partagé au lieu de fakeDriver() (PHP-W…
claude Oct 20, 2026
698b838
Merge pull request #166 from studoo-app/profiler
bfoujols Oct 20, 2026
039ce6e
chore: bump version to v2.8.0
bfoujols Oct 20, 2026
1b178e4
Refactor code structure for improved readability and maintainability
bfoujols Oct 20, 2026
a4efa2b
Refactor code structure for improved readability and maintainability
bfoujols Oct 20, 2026
ca26973
feat(docs): ajouter des variables et des tâches pour la documentation
bfoujols Oct 20, 2026
254b0da
feat(docs): ajouter des fonctionnalités et des instructions de migrat…
bfoujols Oct 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,19 @@ APP_NAME=edu-framework
APP_ENV=prod
## >> Config application

## << Config profiler de code (barre de debug, mode dev uniquement)
## Nécessite l'extension PHP Excimer (installée dans l'image Docker)
## off -> profiler désactivé
## trigger -> profilage à la demande : bouton "Code" de la barre de debug
## (cookie edu_profile=1) ou paramètre ?_profile=1 dans l'URL
## on -> chaque requête est profilée
EDU_PROFILER=trigger
## Nombre de profils conservés dans la base des logs
EDU_PROFILER_KEEP=50
## Image Docker : 1 => avec Excimer (défaut), 0 => sans profiler
EDU_PROFILER_BUILD=1
## >> Config profiler de code

## << Config Mailer
MAILER_DSN="smtp://localhost:1025"
## >> Config Mailer
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ jobs:
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
extensions: mbstring, xml, ctype, iconv, intl, pdo_sqlite, dom, filter, gd, iconv, json, mbstring, pdo, curl
extensions: mbstring, xml, ctype, iconv, intl, pdo_sqlite, dom, filter, gd, iconv, json, mbstring, pdo, curl, excimer
env:
update: true

Expand Down
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,31 @@

**Présentation des versions du framework Edu Framework**

## v2.8.0 - 20/10/2026

**new features**

- Profiler de code dans la barre de debug : le temps passé dans chaque fonction PHP d'une requête HTTP est mesuré par l'extension [Excimer](https://www.mediawiki.org/wiki/Excimer) (profiler par échantillonnage toutes les 0,1 ms, compatible FrankenPHP en mode classique et worker). Le profilage est **à la demande** (`EDU_PROFILER=trigger` par défaut) : le nouveau bloc **Code** de la barre de debug pose le cookie `edu_profile=1` (ou paramètre `?_profile=1`) et reste actif jusqu'au clic sur **Désactiver** ; `EDU_PROFILER=on` profile chaque requête, `off` désactive le profiler. Le profil est rattaché au token de la requête et stocké compressé dans la table `serv_code_profiles` (`EDU_PROFILER_KEEP` profils conservés, 50 par défaut). Le bloc affiche le temps profilé et le top 3 des fonctions ; le nouvel onglet **Code** du profiler (`/_debug/profiler#code/{token}`) liste toutes les fonctions (temps propre / inclusif, filtre par origine `app` / `framework` / `vendor`), leurs appelants et appelés, et exporte le profil au format Speedscope pour un flamegraph. Nouvel endpoint interne `GET /edu-code-profile` (mode dev uniquement). L'image Docker installe Excimer (argument de build `EDU_PROFILER`, `EDU_PROFILER_BUILD=0` pour l'exclure) et `php bin/edu check:config` signale l'extension comme recommandée
- Profiler : la section de résumé d'une requête n'affiche plus que l'URL ; les informations détaillées (méthode, statut HTTP, IP, SAPI, durée, mémoire, date, token) ont été retirées de l'en-tête pour alléger l'affichage

**documentation**

- new [Les fonctionnalités](docs/features.md) : toutes les fonctionnalités du framework regroupées par thème d'apprentissage, avec la notion travaillée et son équivalent dans Symfony
- new [Migrer de la version 2.3 à la version 2.8](docs/migrate/migration-2_3-2_8.md) : étapes de migration (sauvegarde et passage de MySQL à MariaDB, templates d'erreur, cache Twig, variables du `.env`, fichiers Docker), changements et nouveautés des versions 2.4 à 2.8
- update [La barre de debug et le profiler](docs/boost/debug-bar.md) : nouvelle section « Le profiler de code » (installation, modes, lecture du profil avec captures d'écran, lecture du flamegraph avec Speedscope, API)
- update [Installation avec Docker](docs/installation/docker.md) : variables d'environnement `EDU_PROFILER`, `EDU_PROFILER_KEEP` et `EDU_PROFILER_BUILD`
- update [Prérequis](docs/installation/prerequis.md) : installation de l'extension optionnelle `excimer` hors Docker

## v2.7.3 - 17/10/2026

**new features**

- Profiler : la vue Recherche (`/_debug/profiler#search`) gagne les **mêmes onglets de filtrage par famille de statut que la vue des logs** — `Tous / 2xx / 3xx / 4xx / 5xx`, avec le nombre de requêtes par famille en badge. Un clic filtre les résultats sur la famille sélectionnée (l'onglet `Tous` affiche toutes les requêtes), l'onglet actif est mis en évidence et le champ **Statut** du formulaire de recherche est synchronisé pour refléter le filtre appliqué. Les compteurs proviennent de l'API interne `/edu-logs` (`data.counts`, calculés côté serveur) : ils couvrent l'ensemble des requêtes correspondant aux autres filtres (URL, IP, dates, ...) et restent indépendants du filtre de statut, exactement comme les onglets de la vue des logs. Le rendu des badges est partagé entre les deux vues (fonction `renderCountBadges`) afin de garantir un design et un comportement identiques ; le tableau des résultats de la recherche reste inchangé

**bug Fixes**

- fix(toolbar): correction de l'alignement des colonnes contenant des liens (DbGate, phpMyAdmin, Mailpit) dans le panneau de la barre de debug en ajustant le style CSS des éléments `<em>` et des liens

**documentation**

- update [La barre de debug et le profiler](docs/boost/debug-bar.md) : les onglets de filtrage par famille de statut sont documentés pour les vues **Logs** et **Recherche** (clic pour filtrer, onglet actif, synchronisation du champ Statut du formulaire)
Expand Down
7 changes: 7 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,13 @@ RUN install-php-extensions \
intl \
opcache

# Profiler de code de la barre de debug (Excimer, profiler par échantillonnage)
# Installé uniquement pour l'image de développement :
# docker compose build --build-arg EDU_PROFILER=0 => image sans profiler
# Doc : https://www.mediawiki.org/wiki/Excimer
ARG EDU_PROFILER=1
RUN if [ "$EDU_PROFILER" = "1" ]; then install-php-extensions excimer; fi

# Composer (depuis l'image officielle)
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

Expand Down
20 changes: 17 additions & 3 deletions TaskFile.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ vars:
PHPQA: jakzal/phpqa:php8.4-alpine
PHPQA_RUN: "{{.DOCKER_RUN}} --init -it --rm -v {{.PWD}}:/project -w /project {{.PHPQA}}"
MYSQL_TESTING_RUN: "{{.DOCKER_RUN}} --init -it --rm -e MYSQL_ROOT_PASSWORD=studoo -e MYSQL_DATABASE=app_db -p 3309:3306 -d mysql:8.0 --name mysql-testing"
#
# DOCUMENTATION (properdocs)
DOCS_VENV: venv
DOCS_ADDR: 127.0.0.1:8000
DOCS_URL: "http://{{.DOCS_ADDR}}/edu-framework/"

##
## === TASKS ==================================================
Expand All @@ -65,6 +70,7 @@ tasks:
- echo "* start Start project exemple"
- echo "* stop Stop project exemple"
- echo "* docker-status Check if Docker is up and show services with ports"
- echo "* start-docs Start the documentation ({{.DOCS_URL}})"
- echo "* before-commit Analyse project before commit"
- echo " ";
- echo " 🎛️ OTHER TASK ----------------------------------------------------------"
Expand Down Expand Up @@ -298,8 +304,16 @@ tasks:
task docker-stop
fi

start-doc:
start-docs:
desc: "Start the documentation (properdocs serve)"
aliases: [start-doc]
cmds:
- |
source venv/bin/activate
properdocs serve
# Environnement Python de la documentation (créé au premier lancement)
if [ ! -x {{.DOCS_VENV}}/bin/properdocs ]; then
echo " 📦 Installation de l'environnement de la documentation ({{.DOCS_VENV}})"
python3 -m venv {{.DOCS_VENV}}
{{.DOCS_VENV}}/bin/pip install -q -r requirements.txt
fi
echo " 📖 Documentation : {{.DOCS_URL}}"
{{.DOCS_VENV}}/bin/properdocs serve -a {{.DOCS_ADDR}}
10 changes: 9 additions & 1 deletion compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,21 @@
services:
frankenphp:
container_name: ${APP_NAME}-http-server
build: .
build:
context: .
args:
# Profiler de code de la barre de debug (extension Excimer) :
# 1 => installé (défaut, développement) | 0 => image sans profiler
EDU_PROFILER: ${EDU_PROFILER_BUILD:-1}
# tty: true => logs lisibles en dev ; retirer pour des logs JSON (prod)
tty: true
environment:
# Application (voir .env)
APP_NAME: ${APP_NAME:-edu-framework}
APP_ENV: ${APP_ENV:-dev}
# Profiler de code de la barre de debug : off | trigger | on (voir .env)
EDU_PROFILER: ${EDU_PROFILER:-trigger}
EDU_PROFILER_KEEP: ${EDU_PROFILER_KEEP:-50}
TZ: ${TZ:-Europe/Paris}
# Base de données : mêmes valeurs que le .env, sauf l'hôte et le port
# qui, dans le réseau Docker, sont toujours ceux du service (database:3306)
Expand Down
2 changes: 2 additions & 0 deletions docs/_summary.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
* [Edu Frame](index.md)
* [Objectifs pédagogiques](about.md)
* [Les fonctionnalités](features.md)
* [Démarrer](installation/index.md)
* [Avant de démarrer](installation/prerequis.md)
* [Installation](installation/installation.md)
Expand All @@ -24,6 +25,7 @@
* [Les erreurs HTTP](boost/http-error.md)
* [La barre de debug et le profiler](boost/debug-bar.md)
* [Migrer](migrate/major.md)
* [Migrer de la version 2.3 à la version 2.8](migrate/migration-2_3-2_8.md)
* [Migrer de la version 2.2 à la version 2.3](migrate/migration-2_2-2_3.md)
* [Migrer de la version 1.0 à la version 2.0](migrate/migration-1_2-2_0.md)
* [Contribuer](contributor/index.md)
Expand Down
Binary file added docs/assets/screen-profiler-code-bar.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/screen-profiler-code-graph.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/screen-profiler-code-tab.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/screen-speedscope-home.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/screen-speedscope-left-heavy.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading