我想启用某种涉及 PHP(后端)和 JS(前端)的实时机制。 SSE 似乎是一种不错的方法,因为我不需要双向连接。
我面临的问题是 Google App Engine 正在缓冲 PHP 响应,破坏 flush() 的使用,因此阻止我构建 SSE 服务器。
有谁知道如何让 GAE 不缓冲响应?使用流媒体?套接字?被证明可以在 GAE 下工作的替代方案?我尝试过使用通道,但这带来了巨大的挑战,因为我的应用程序完全基于 PHP 构建,我唯一想要的是添加一些实时通知功能。在同一个项目中共存两种语言也有其自身的复杂性。
任何答案、建议、输入或反馈将不胜感激。
编辑:
正如@Shrike 在评论中指出的,此答案中的信息已过时。使用新的运行时(python3、Java 11、PHP7),自动缩放的请求超时为 10 分钟,基本或手动缩放的请求超时为 24 小时(来源:app engine docs)。
即便如此,也无法使用服务器发送的事件
App Engine 不支持在处理请求时将数据以增量块的形式发送到客户端的流式响应。代码中的所有数据都按上述方式收集并作为单个 HTTP 响应发送。
遗留答案(适用于 Java 8、PHP 5 和 Python 2):
Server Sent Events 和 Web Sockets 等技术在设计上无法在 App Engine 上运行。 App Engine 中的所有前端请求的运行时间限制为 60 秒,任务限制为 10 分钟。因此,即使您将与客户端的连接保持打开状态(如服务器发送事件),它也会在 60 秒后关闭。如果你可以打开一个任务的网络套接字连接(你不能)它会在十分钟后关闭。
备选方案是:
您可以通过禁用缓冲来实现此目的,您可以通过在响应标头中设置
X-Accel-Buffering: no
来实现。
默认情况下,来自 App Engine 的所有响应都缓冲在 64k 块中。在某些情况下,禁用缓冲并直接将字节流式传输到客户端可能是有意义的。这通常是使用挂起 GET 或服务器发送事件 (SSE) 时的首选。要禁用缓冲,您可以将 X-Accel-Buffering 响应标头设置为 no。