2012-09-04 84 views
2

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

对测试环境的一些细节:在IIS

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

FastCGI的设置:

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

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

看来,PHP一直发射了太多要求,SQL服务器,成为太忙,无法处理其他请求。如果是这种情况,那么应该有一些我可以调整来让PHP处理更多的并发请求。

有谁知道吗?请帮忙!

+0

会话锁定? –

+2

出于好奇,您是否尝试过通过完全不同的浏览器访问网站(例如,使用Firefox for one和Chrome for another)。只是试图排除这个想法,也许这只是你的会议被锁定,而不是整个网站。使用不同的浏览器会导致创建多个会话。同一浏览器中的不同标签会共享同一个会话。 –

+0

查看[this](http://stackoverflow.com/questions/12070345/php-multiple-ajax-requests-first-request-block-second-request/12070517)问题。可能你有同样的问题 –

回答

4

我就刺在黑暗这里假设它是由于会话锁定。

当您使用PHP附带的标准会话处理程序时,它会确保在整个脚本执行过程中(除非session_write_close()之前调用过)使用(建议性)写入锁定才能破坏会话文件。

试图访问同一会话的其他脚本(你的浏览器会通过相同的cookie值)将等待锁得到释放,只要需要。

你可以用两种完全不同的浏览器来模拟两个用户(一个运行报告,其他访问站点)进行验证。如果这有效,你很确定这是由于会话锁定。

这不应该是一个问题,因为你知道,当你运行报表,但如果这会引起问题,但是你可以考虑两件事情:

  1. 没有启动一个会话报告脚本(不过这也意味着未经授权的用户可以尝试运行报告脚本)
  2. 您繁重的工作开始前关闭会话,使用session_write_close()您已经验证用户的身份之后。
+0

非常感谢您的建议,但用户如何获得会话锁?他们中的大多数都通过网络代理从他们自己的本地PC连接到网站。我问其中一个用户从他的PC上运行这个报告来复制问题,然后登录到IIS服务器,但仍然遇到同样的问题,直到报告超时...我们都使用IE 8浏览器。 – user1646590

+0

我不确定为什么会发生这种情况,特别是因为您做了一个测试来验证它是否与两个不同的浏览器一起工作......不知道代理服务器有什么顽皮的东西,但它不应该发送自己的cookie。 –

+0

问题的根源可能不同于此。无论如何非常感谢帮助。 – user1646590