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.
// 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 » :
// 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() :
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.