我有一个客户端发送一个需要很长时间处理的请求,客户端用ajax发送请求。一旦请求在服务器上被接受,客户端就会重定向到另一个页面,这是通过 fastcgi_finish_request 完成的(我正在运行 php-fpm)
长工作.php:
<?php
fastcgi_finish_request();
sleep(1000); //Simulate long computation time
?>
客户端.js:
$.ajax({
url: "...",
data: {},
success: function() {
top.location.href="next_page.php"
}
});
ajax 被发送,成功回调导致重定向到预期的 next_page.php。
但是随后页面停止,直到 sleep 结束我才得到任何服务。看起来我的连接正在等待 same php-fpm 进程完成
我正在用 php-fpm 运行 nginx,知道为什么会这样吗?
编辑:
经过更多调查,我发现导致此行为的原因是我有一个事件 session (来自 facebook SDK),当我销毁 LongWork.php 上的 session 时:
<?php
session_destroy(); // Session was halting the client from accessing another page
fastcgi_finish_request();
sleep(1000); //Simulate long computation time
?>
你能反射(reflection)一下这个解决方案吗?
我应该做一些与 session_destroy()
不同的事情吗?
编辑:
在 Lachlan Pease 评论之后,我将 session_destroy
切换为 session_write_close
最佳答案
问题出在 session 存在上,有关更多详细信息,请参阅问题中的编辑
关于ajax - fastcgi_finish_request 在打开 session 存在时创建挂起连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11758334/