【问题标题】:Server-sent events and ZF 2.5服务器发送的事件和 ZF 2.5
【发布时间】:2015-08-20 01:24:40
【问题描述】:

我正在使用 ZF2.5 开发应用程序。我需要制作一个 SSE(服务器发送事件)模块,但我无法使用控制器来做到这一点,它不会让我的连接保持活动状态(类型:文本/事件流)。所以我在一个单独的 php 文件中执行此操作,但我需要对此进行身份验证,并且需要从 Zend 环境“外部”的该文件访问 Zend 的服务管理器。

有可能吗?有什么建议吗?

【问题讨论】:

    标签: zend-framework2 comet


    【解决方案1】:

    是的,您可以在 ZF2 中做到这一点,但这并不容易。 SSE 的基础是连接保持打开状态。因此,您需要在 php 中以某种方式使用 while(true)similar 来保持进程运行。

    控制器在功能完成后终止并发送响应。您必须将此逻辑放入控制器中。接下来,响应处理程序缓冲 ZF2 中的所有输出,然后一次发送所有数据。您需要重新编程 ZF2 输出缓冲流程,这样您就可以直接从控制器发送数据而无需缓冲。因为否则,你 while(true) 循环永远不会发送数据,只有当你打破循环时。

    所以简短的回答:在 ZF2 中几乎一切皆有可能,包括您的需求。但这并不是那么简单。

    另一种方法是在独立脚本中加载服务管理器。这也是完全可能的。使用应用程序配置并合并其他配置,您需要构建完整的配置并使用它配置 SM。然后实例化后,就可以充分利用它的系统了。

    同样在这里,仅实例化 SM 可能会很困难。这里更简单的是实例化应用程序并从中获取 SM:

    $app = Zend\Mvc\Application::init(include 'config/application.config.php');
    $sm = $app->getServiceManager();
    

    请注意,您不会“运行()”应用程序,只能引导它!

    【讨论】:

    • 非常感谢。您提到的替代解决方案效果很好。现在我可以从提供的 php 文件中访问已经过身份验证的 $_SESSION 并且只允许该用户接收 SSE!
    • 嗯,其实,我刚刚发现了一个问题。当我将此代码放在我的 sse.php 上时,应用程序停止响应,我的所有请求都以 504 超时结束......太糟糕了,但回到第一方......
    猜你喜欢
    • 1970-01-01
    • 2015-10-26
    • 2013-01-11
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2015-09-24
    相关资源
    最近更新 更多