【发布时间】:2016-09-07 01:38:59
【问题描述】:
我遇到了这个问题:
- 我正在使用 AJAX 向服务器发送一个请求,它在服务器端接收一些参数,并在服务器端生成一个 PDF。
- 根据所使用的数据,生成 pdf 文件可能需要很长时间
- AWS 的弹性负载均衡器在 60 秒的“空闲”连接后决定丢弃套接字,因此我的请求在这种情况下失败。
我知道可以增加 ELB 设置中的超时时间,但不仅我的系统管理员反对,这也是错误的解决方案和不好的做法。
我了解解决问题的最佳方法是通过套接字发送数据以“告诉 ELB”我仍然处于活动状态。由于我们的体系结构和会话被锁定的事实,每 30 秒向服务器发送一个虚拟请求不起作用(即,我们不能有来自同一会话的并发 AJAX 请求,否则一个等待完成,直到另一个完成)
我尝试只对服务器上的文件发出 get 请求,但这并没有什么不同,我假设“套接字”是原始 AJAX 调用使用的那个。
服务器上的函数非常线性,几乎不可能分成多个调用,让它在后台运行并每 5 秒检查一次直到完成的想法让我在资源控制方面感到不舒服。
TL;DR : 在 AJAX 请求挂起时,是否有任何优雅而有效的解决方案来保持套接字处于活动状态?
非常感谢,如果有人可以提供帮助,我在 SO 上发现了几个类似的问题,但都由“致电亚马逊团队要求他们增加设置中的超时”回答,这对我来说听起来很糟糕。
【问题讨论】:
-
您真的需要在生成 pdf 的整个过程中保持会话锁定吗?
-
好吧,我需要等待它返回 PDF。我知道我可以让它在后台运行,然后检查文件是否可用,但它也放在 S3 上,要使用我们的安全系统检索它,我需要生成文件的校验和,这意味着我可以'在生成完成之前,不要预测链接将是什么。
-
不,我的意思是在继续构建 pdf 的同时发布会话,从而允许您定期发送 ajax 请求以保持请求处于活动状态,直到最终完成。
-
对不起,我误读了你。但是会话是由 Zend 全局持有的,所以如果我释放它,那么在调用完成后,用户将无法在当前会话中继续使用该应用程序。
-
我也不是这个意思。会话将保持活动状态,您将无法在给定的请求中再访问它。从会话中获取您需要的内容,发布它,然后生成 pdf。
标签: php ajax amazon-web-services amazon-elb