2014-08-30 98 views
2

我有一些基本的网站跟踪软件,发送JSON objectjQuery AJAX从跨页面的网页到数据由php脚本处理的服务器。这在window.onbeforeunload上触发。运行PHP脚本没有网页等待它完成

当对我的php脚本进行基准测试时,我发现不同域上的客户端网站仍然在等待php脚本在加载下一页之前完成运行。例如,客户站点的访问者可以导航到另一个页面。我们发送JSON object跨域到服务器来处理它。如果我将sleep(30);添加到我的php脚本中,客户端网站将不会加载下一页,直到此php脚本完成(30+秒)。

运行此脚本后,我不需要返回任何值,因此如何确保此php脚本在不影响客户端网站的情况下运行?

我希望我已经解释得很清楚了。如果我没有问任何问题,谢谢。

SOLUTION:

这是对我工作(http://php.net/manual/en/features.connection-handling.php#93441):

ob_end_clean(); 
header("Connection: close\r\n"); 
header("Content-Encoding: none\r\n"); 
ignore_user_abort(true); // optional 
ob_start(); 
echo ('Text user will see'); 
$size = ob_get_length(); 
header("Content-Length: $size"); 
ob_end_flush();  // Strange behaviour, will not work 
flush();   // Unless both are called ! 
ob_end_clean(); 

//do processing here 
sleep(5); 

echo('Text user will never see'); 
//do some processing 

回答

1
  • 对于PHP-FPM:

    要结束与客户端的连接(发送响应) ,但是继续运行脚本并处理一些数据,这个功能可以帮助你 - fastcgi_finish_request

  • 对于Apache

    请参阅此链接 - close a connection early

+1

谢谢你,从我的理解,这看起来像一个很好的解决方案。但是我收到一个错误:'调用未定义函数fastcgi_finish_request()'。任何想法为什么?谢谢。 – 2014-08-30 14:55:06

+2

可能你使用的是Apache而不是nginx + fpm,我认为这个函数只适用于fpm。 – Casey 2014-08-30 14:58:05

+2

也许这是有用的:http://stackoverflow.com/questions/138374/close-a-connection-early – 2014-08-30 15:10:03