2012-08-01 54 views
4

我有一个客户端发送需要很长处理时间的请求,客户端在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_destroysession_write_close

+0

客户端是否使用Internet Explorer? - 我相信它不会终止连接,除非您至少发送255个字符 - 尽管这可能只是旧版本。我不知道,我不使用它。 – Leigh 2012-08-01 11:43:48

+0

@Leigh问题是在服务器上的会话,这是在每个客户端,请参阅编辑问题 – ekeren 2012-08-01 11:51:00

+1

@ekeren,你应该能够使用session_write_close()来解决这个问题,而不是session_destroy() - 说,我'd仍然提出了一个关于这个PHP的错误,这不是完全预期的行为 编辑:其实,想到它,这是预期的行为 - 默认情况下,PHP会阻止,如果用户的会话已经打开。相反,只有在后续页面需要时才可以尝试打开会话;立即运行session_start()已经成为习惯,但使用输出缓冲可以在需要时启动,而不会产生不良影响。 – 2012-08-01 12:05:52

回答

1

的问题是与会话存在,请参阅问题编辑为更多详细信息

0

我也遇到过这个问题, 我注册了af通过register_shutdown_function, 和函数开始fastcgi_finish_request,而我发现脚本fastcgi_finish_request()仍然阻止用户的页面,同时把session_destroy();在fastcgi_finish_request()之前;确实有效,并且用户的页面不再被阻止。