Darkwood · Symfony 8 · Flow · Blackfire

Profiler un flow Symfony avec Blackfire

Rendre les workers observables —
pas seulement mesurables.

app:flow:profile-demo · 3 démos Symfony

Worker
→
Étapes nommées
→
Flamegraph lisible
@matyo91

Le problème

Les workers Symfony sont difficiles à profiler.

while (true) {
    $message = $queue->consume();
    if (!$message) { sleep(1); continue; }
    $this->process($message);  // ← boîte noire
}
flowchart LR
  LOOP[Boucle worker]
  PROC[process opaque]
  BF[Blackfire]
  LOOP --> PROC
  PROC --> BF
  BF --> FLAT[Un gros bloc CPU]

Blackfire voit du PHP — pas une architecture.

01 | problème @matyo91

La boucle n'est pas l'ennemi

Symfony worker · driver Flow · YFlow

Worker

while (true)

Driver

await() loop

YFlow

$loop($next)

flowchart TB
  W[Worker Symfony]
  AW[flow await]
  D[Driver loop]
  J1[Job extract]
  J2[Job transform]
  J3[Job load]
  W --> AW --> D
  D --> J1 --> J2 --> J3

Pas la boucle infinie — c'est process() opaque.

02 | boucles @matyo91

Blackfire + signaux

Profiler un processus déjà lancé.

Terminal 1

bin/console app:flow:profile-demo -vv

Terminal 2

kill -USR2 <pid>  # start
kill -USR2 <pid>  # stop → URL
flowchart LR
  RUN[Worker tourne]
  S1[SIGUSR2 start]
  WIN[Fenêtre profiling]
  S2[SIGUSR2 stop]
  URL[URL profil]
  RUN --> S1 --> WIN --> S2 --> URL

Profile les itérations — pas le boot du container.

03 | blackfire @matyo91

Rôle de Flow

Le profiling ne commence pas dans Blackfire.

Il commence dans la structure du traitement.

Flow rend la boucle profileable en transformant chaque itération en étapes d'exécution explicites.

$flow(new Ip($batch));
$flow->await();  // driver loop + jobs nommés
04 | flow @matyo91

Démo 1

Kibono Flow — pipeline ETL visible

php-etl / Kiboko dans Flow

extractExtractorInterface → buckets
transformarray_map · str_rot13
loadaccumulation + écriture
walkrésultats + JSON

1 itération = 1 batch produit · github.com/matyo91/kibono-flow

05 | kibono @matyo91

Démo 2

PHP Flow — ETL + orchestration

Couche 1 · ETL

Inspiré Flow PHP

Extractor → Transformer → Loader

Couche 2 · Flow

Jobs d'orchestration

prepare → extract → transform → load

Hotspot CPU : NormalizeOrderTransformer (SHA-256 ×1000)

github.com/matyo91/php-flow · flow-php.com

06 | php-flow @matyo91

Démo 3

VibePHP Flow — pipeline applicatif

Structure VibePHP · runtime factice reproductible

resolvepath → script vibe/
readfile_get_contents
promptjson_encode contexte
executeregex · includes · hash
metricsdurée · mémoire · status

1 itération = 1 requête simulée · github.com/matyo91/vibephp-flow

07 | vibephp @matyo91

Lecture du profil

Ce que Blackfire montre — et pas.

Oui

  • CPU par fonction
  • Mémoire · I/O
  • Frames par job / étape

Non

  • Intent métier
  • Où mettre un cache
  • « Flow est plus rapide »

Flow ne remplace pas Messenger. Il structure le code dans le worker.

08 | lecture @matyo91

Conclusion

Le profiling commence par la structure.

Worker · driver · YFlow — trois boucles, une question : que se passe-t-il dans une itération ?

Boucle
→
Étapes
→
Profil actionnable
@matyo91