php并发请求卡住?

时间:2012-09-04 15:18:59

标签: php performance fastcgi

我有一个运行报告的PHP应用程序,并在90秒内向SQL服务器发出大约100万个SQL查询。在此期间,没有其他人可以使用这个基于Web的应用程序 - 鸡蛋计时器正在滚动,但在报告超时或完成之前没有任何内容加载。我在一个孤立的环境中测试了这个问题,只有我自己在那里,在浏览器中运行报告,然后从其他浏览器窗口到此应用程序站点的任何操作都挂起。

有关测试环境的一些细节:

Windows 2008 R2 x64 - IIS 7.5 - PHP 5.3.8 via FastCGI 
Windows 2008 R2 x64 - SQL Server 2008 R2 x64

IIS中的FastCGI设置:

Instance MaxRequests = 200
Max Instances = 16
Activity Timeout = 70
Idle Timeout = 300
Queue Length = 1000
Rapid Fails PerMin = 10
Request Timeout = 90

每个SQL请求在SQL服务器端完成不到60毫秒。 Web服务器和SQL Server的CPU负载均小于10%。运行报告时,Web服务器具有16GB RAM和大约60%的RAM。

似乎PHP已经向SQL服务器发出了太多请求,并且变得太忙而无法处理其他请求。如果是这种情况,那么应该有一些我可以调整以使PHP处理更多并发请求的东西。

有谁知道吗?请帮忙!

1 个答案:

答案 0 :(得分:5)

我只是在黑暗中刺伤并假设它是由于会话锁定。

当您使用PHP附带的标准会话处理程序时,它确保在脚本执行过程中使用(建议)写锁定不会损坏您的会话文件(除非先前调用session_write_close()

尝试访问同一会话的其他脚本(您的浏览器将传递相同的cookie值)将等待锁定被释放,只要它需要。

您可以使用两个完全不同的浏览器来验证这一点,以模拟两个用户(一个运行报告,另一个访问站点)。如果可行的话,你很确定这是因为会话锁定。

这不应该是一个问题,因为您将知道何时运行报告,但如果这可能会导致问题,您可以考虑两件事:

  1. 不启动报告脚本的会话(但这也意味着未经授权的用户可能会尝试运行您的报告脚本)
  2. 在您的笨拙工作开始之前关闭会话,在验证用户身份后使用session_write_close()