veilletech.fr
17 sept. Feed du jour
#06 LARAVEL Article

Laravel 13.32 : du temps réel sans WebSocket

Le meilleur service temps réel reste celui que vous n'avez pas à déployer.

Laravel 13.32 ajoute un driver de broadcasting Mercure, qui pousse les messages en Server-Sent Events sur du HTTP ordinaire plutôt qu'en WebSocket. Couplé à FrankenPHP, dont le hub Mercure est intégré, le driver fonctionne sans URL ni secret à configurer : le temps réel cesse d'être un service séparé à déployer.

2 min de lectureintermédiairevidéo 1:16
Partager
Sommaire5 sections
  1. Ce qui se passe
  2. Ce que ça change
  3. Déplacer un fichier entre disques
  4. Des enums dans la pause de file
  5. À retenir

Ce qui se passe

Laravel 13.32.0 ajoute un driver de diffusion Mercure, contribué par Kévin Dunglas — l'auteur de Mercure et de FrankenPHP. Mercure est un protocole temps réel qui passe par SSE (Server-Sent Events) et non par WebSocket.

PR #61474 pour le driver, #61587 pour la prise en charge dans la commande d'installation du broadcasting, et un correctif Echo côté client.

Ce que ça change

SSE, c'est du HTTP ordinaire : le navigateur ouvre une connexion que le serveur garde ouverte et dans laquelle il pousse les messages. Pas de protocole séparé, pas de négociation de montée en version, pas de port dédié — donc ça traverse les proxies et les pare-feux d'entreprise qui bloquent le reste.

PHP
// config/broadcasting.php
'mercure' => [
    'driver' => 'mercure',
    'url' => env('MERCURE_URL'),
    'public_url' => env('MERCURE_PUBLIC_URL'),
    'secret' => env('MERCURE_JWT_SECRET'),
    'encryption_key' => env('MERCURE_ENCRYPTION_KEY'),
],

Le point le plus concret : avec FrankenPHP, le hub intégré n'a besoin ni de url ni de secret. Si l'application est déjà servie par FrankenPHP, le temps réel devient une option du serveur en place, pas un service de plus à déployer, superviser et payer.

Les canaux de présence sont pris en charge, et les canaux privés peuvent être chiffrés de bout en bout via le préfixe private-encrypted-*.

La limite tient au protocole : SSE est unidirectionnel, du serveur vers le client. Pour remonter de l'information, on repasse par une requête HTTP.

Déplacer un fichier entre disques

Jack Bayliss ajoute copyToDisk() et moveToDisk() à FilesystemAdapter (PR #61511), qui remplacent le motif manuel « ouvrir un flux en lecture, écrire un flux » :

PHP
// Copie vers le disque backup, conserve l'original
Storage::disk('local')->copyToDisk('backup', 'reports/report.csv');

// Copie puis supprime la source
Storage::disk('local')->moveToDisk('backup', 'reports/report.csv');

// Chemin de destination différent
Storage::disk('local')->copyToDisk('s3', 'reports/report.csv', '2026/report.csv');

Une PR de suivi (#61519, par ziadoz) accepte une instance de filesystem à la place d'un nom de disque.

Des enums dans la pause de file

Toujours par Jack Bayliss (#61464), Queue::pause(), Queue::resume() et Queue::pauseFor() acceptent des enums PHP, alignant ces méthodes sur ce que permettaient déjà les attributs Queue et Connection des jobs, et des méthodes comme route() ou forward() :

PHP
Queue::pause(Queues::notifications, Connections::Redis);
Queue::pauseFor(Queues::notifications, Connections::Redis, 60);

À retenir

La 13.32.0 compte plus de 40 commits, dont une série de correctifs discrets mais utiles : Str::password() qui renvoyait des caractères en trop, Str::camel() qui ne mettait pas en minuscule un premier caractère multioctet, collapseWithKeys() qui plantait sur des clés de chaîne, et le cache Redis tagué qui ne synchronisait pas l'expiration de l'entrée de tag.

Mais le changement structurant, c'est Mercure. Il ne remplace pas Reverb sur tous les usages — le bidirectionnel reste au WebSocket — il supprime un service dans le cas très courant où le serveur ne fait que pousser.