我有一个客户端发送需要很长处理时间的请求,客户端在ajax中发送请求。一旦请求被客户端重定向到另一个网页的服务器上接受的,这是由fastcgi_finish_request完成(我运行PHP-FPM)fastcgi_finish_request在存在开放会话时创建挂起连接
LongWork.php:
<?php
fastcgi_finish_request();
sleep(1000); //Simulate long computation time
?>
client.js:
$.ajax({
url: "...",
data: {},
success: function() {
top.location.href="next_page.php"
}
});
ajax被发送,成功回调导致按照预期重定向到next_page.php。
但是,然后页面暂停,我没有得到任何服务,直到睡眠完成。它看起来像我的连接正在等待相同 php-fpm过程完成
我正在用php-fpm运行nginx,任何想法为什么会发生这种情况?
编辑:
更多的调查后,我发现原因此行为是,我有一个活动会话(从Facebook SDK),当我摧毁LongWork.php会议:
<?php
session_destroy(); // Session was halting the client from accessing another page
fastcgi_finish_request();
sleep(1000); //Simulate long computation time
?>
请您反思一下这个解决方案吗?
我应该做的事情不同session_destroy()
编辑:
以下拉克兰皮斯评论,我已经切换session_destroy
与session_write_close
客户端是否使用Internet Explorer? - 我相信它不会终止连接,除非您至少发送255个字符 - 尽管这可能只是旧版本。我不知道,我不使用它。 – Leigh 2012-08-01 11:43:48
@Leigh问题是在服务器上的会话,这是在每个客户端,请参阅编辑问题 – ekeren 2012-08-01 11:51:00
@ekeren,你应该能够使用session_write_close()来解决这个问题,而不是session_destroy() - 说,我'd仍然提出了一个关于这个PHP的错误,这不是完全预期的行为 编辑:其实,想到它,这是预期的行为 - 默认情况下,PHP会阻止,如果用户的会话已经打开。相反,只有在后续页面需要时才可以尝试打开会话;立即运行session_start()已经成为习惯,但使用输出缓冲可以在需要时启动,而不会产生不良影响。 – 2012-08-01 12:05:52