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
);Cookie Mercure
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