Symfony 6中使用HubInterface调用Mercure发布更新失败求助
排查Mercure发布更新失败问题
1. 修正容器内Mercure访问URL
Docker容器内部无法通过localhost:8081访问Mercure服务——localhost在PHP容器中指向容器自身,而非宿主机。需区分对外(前端JS)和对内(PHP后端)的Mercure地址:
- 修改
.env文件添加两个环境变量:
# 前端JS使用的公开访问地址 MERCURE_PUBLIC_URL=http://localhost:8081/.well-known/mercure # PHP后端使用的容器网络内部地址 MERCURE_INTERNAL_URL=http://mercure:3000/.well-known/mercure
- 更新
config/packages/mercure.yaml配置:
mercure: hubs: default: url: '%env(MERCURE_INTERNAL_URL)%' public_url: '%env(MERCURE_PUBLIC_URL)%' jwt: secret: '%env(MERCURE_JWT_SECRET)%' publish: ['*']
2. 验证JWT配置一致性
- 确保
MERCURE_JWT_SECRET在PHP容器和Mercure容器中使用完全相同的值,且环境变量在两个容器中均正确加载。 - 可通过命令生成测试JWT并验证权限声明:
# 替换your-secret-key为实际密钥 echo '{"mercure":{"publish":["*"]}}' | jwt encode -s your-secret-key
解码后确认mercure.publish字段包含*或目标主题https://example.com/my-private-topic。
3. 启用详细日志定位错误
Symfony日志
在.env中开启DEBUG模式,查看var/log/dev.log获取Mercure请求的具体错误信息(如401权限拒绝、连接超时等):
APP_DEBUG=1
Mercure容器日志
通过Docker命令查看Mercure实时日志,排查请求是否被服务端拒绝:
docker-compose logs -f mercure
4. 针对性配置HTTP客户端
若存在证书验证问题,为Mercure请求单独配置HTTP客户端:
# config/packages/framework.yaml framework: http_client: scoped_clients: mercure.client: base_uri: '%env(MERCURE_INTERNAL_URL)%' verify_peer: false
然后在Mercure配置中指定使用该客户端:
# config/packages/mercure.yaml mercure: hubs: default: url: '%env(MERCURE_INTERNAL_URL)%' public_url: '%env(MERCURE_PUBLIC_URL)%' http_client: mercure.client jwt: secret: '%env(MERCURE_JWT_SECRET)%' publish: ['*']
5. 测试容器网络连通性
进入PHP容器,直接curl Mercure端点验证基础连接:
# 进入PHP容器 docker-compose exec php bash # 测试Mercure服务连通性 curl http://mercure:3000/.well-known/mercure
若返回405 Method Not Allowed,说明连接正常;若出现连接超时/主机无法解析,需确认PHP与Mercure容器是否在同一个symfony网络中(你的配置已满足,但可重新启动容器网络验证)。
内容的提问来源于stack exchange,提问作者Quinie
相关产品推荐
相关产品推荐

