【问题标题】:Why pushing update to Mercure Hub with PublisherInterface throw a TransferException?为什么使用 PublisherInterface 向 Mercure Hub 推送更新会引发 TransferException?
【发布时间】:2021-06-29 13:33:20
【问题描述】:

我在我的 Windows 机器上的 Docker 容器中使用 Mercure Hub。我有一个 Symfony 应用程序,我想使用 Mercure 包向客户端推送消息。

/**
 * @Route("/message", name="sendMessage", methods={"POST"})
 */
public function __invoke(PublisherInterface $publisher, Request $request): RedirectResponse
{
    $update = new Update('https://chat.afsy.fr/message', json_encode([
        'message' => $request->request->get('message'),
    ]));

    $publisher($update);

    return $this->redirectToRoute('home');
}

当我在客户端 javascript 中获取此端点时(即发布要由集线器推送的消息),我从 PublisherInterface 内的 HTTPClient 得到了这个异常:

传输异常

fopen():SSL 操作失败,代码为 1。OpenSSL 错误消息: 错误:1416F086:SSL 例程:tls_process_server_certificate:证书 验证失败

当我使用 Mercure 调试工具发布消息时,一切正常,但正如我们所见,我的 Symfony 应用程序却不行。我想知道为什么? :)

【问题讨论】:

    标签: docker symfony mercure


    【解决方案1】:

    我之前遇到过这个错误。 Simply Mercure Hub 需要有效的 SSL 证书才能工作,而 Symfony CLI (> symfony serve) 提供的证书不是有效的!

    你可以:

    • 为您的项目添加有效的 SSL 证书。
    • 或者,如果它是 Symfony 4 项目,您可以安装 Symfony Web 服务器 composer require symfony/web-server-bundle 并使用 php bin/console server:run 在 HTTP 而不是 HTTPS 上启动服务器。
    • 您还可以使用 composer required apache-pack 安装 apache-pack 并在您的计算机上设置一个虚拟主机。

    【讨论】:

    • 嘿,感谢您的快速回答 :) 这是一个 Symfony 5 项目,这是否意味着我不能使用 Symfony 本地 Web 服务器进行开发?或者解决方案 1 和 3 可以在该环境中应用吗?
    • 我的 Symfony 4 项目遇到了同样的问题。我已经完成了解决方案 2。但它并没有解决问题。我现在有一个类似的例外,它说:fopen(): Unable to locate certificate CN
    • @yavuz16dev 当您使用 server:run 运行项目时,它是否连接到 httphttps
    【解决方案2】:

    您可以为开发环境设置 Symfony HTTP 客户端的默认选项:

    # config/packages/dev/framework.yaml
    framework:
    
      ...
    
      http_client:
          default_options:
              verify_peer: false
    

    【讨论】:

      猜你喜欢
      • 2021-05-09
      • 2015-08-16
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 2018-09-27
      • 2019-03-17
      相关资源
      最近更新 更多