Skip to content

Push en temps réel Mercure

Doggy implémente le push en temps réel côté serveur via le protocole Mercure. Le Hub Mercure est intégré à FrankenPHP et peut être activé simplement en le configurant dans le Caddyfile, sans conteneur ni service supplémentaire.

Architecture

客户端 (EventSource)
    ↑ SSE
    └── http://localhost:8000/.well-known/mercure

    Caddyfile (FrankenPHP)
        ↑ mercure 指令内嵌 Hub
    FrankenPHP (内置 Hub)

Configuration du Caddyfile

Le Hub Mercure est intégré dans le Caddyfile de FrankenPHP :

caddy
http://localhost:8000 {
    route /.well-known/mercure {
        mercure {
            transport bolt {
                path /var/www/var/mercure.db
            }
            publisher_jwt !ChangeThisMercureHubJWTSecretKey!
            subscriber_jwt !ChangeThisMercureHubJWTSecretKey!
            cors_origins http://localhost:8000
            publish_origins *
            anonymous
        }
    }
}

Jeton JWT

MercureTokenFactory génère des JWT avec les droits d'abonnement :

php
// src/Security/MercureTokenFactory.php
$token = $factory->createSubscribeToken(
    topics: ['/user/123/*', '/entity/*'],
    roles: ['ROLE_USER'],
    expiresIn: 3600
);

MercureCookieSubscriber injecte le cookie mercureAuthorization dans chaque réponse :

php
// 自动生成的订阅主题
$topics = [
    'https://enterprise.local/user/' . $userId . '/export',
    '/user/' . $userId . '/*',
    '/entity/*',
];

Abonnement côté frontend

javascript
const url = new URL('/.well-known/mercure', window.location.origin);
url.searchParams.append('topic', '/user/' + userId + '/*');
const eventSource = new EventSource(url);
eventSource.onmessage = (event) => {
    const data = JSON.parse(event.data);
    // 处理推送消息
};

Applications principales

  • Progression des exports : push en temps réel de la progression des exports de fichiers volumineux
  • État de présence en ligne : PresenceService + PresenceApiController
  • Notifications en temps réel : messages système, rappels d'approbation
  • Synchronisation des données : mises à jour en temps réel lors de la collaboration multi-utilisateurs

Open source sous licence MIT | Copyright © 2026 Doggy