7

我有一个客户端发送需要较长处理时间的请求,客户端以 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 如预期的那样。

但是随后页面停止,直到睡眠结束我才得到任何服务。看起来我的连接正在等待相同的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()

编辑:

在 Lachlan Pease 发表评论之后,我换session_destroysession_write_close

4

2 回答 2

1

问题在于会话存在,有关更多详细信息,请参阅问题中的编辑

于 2012-08-01T12:28:39.283 回答
0

我也遇到过这个问题,我通过 register_shutdown_function 注册了一个函数来运行,这个函数从 fastcgi_finish_request 开始,而我发现 fastcgi_finish_request() 之后的脚本仍然阻塞用户的页面,而把 session_destroy(); 在 fastcgi_finish_request() 之前;确实有效,并且用户的页面不再阻塞。

于 2015-04-10T15:24:01.877 回答