首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php并发请求阻塞?

问php并发请求阻塞?
EN

Stack Overflow用户
提问于 2012-09-04 23:18:59
回答 1查看 1.6K关注 0票数 2

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

关于测试环境的一些详细信息:

代码语言:javascript
复制
Windows 2008 R2 x64 - IIS 7.5 - PHP 5.3.8 via FastCGI 
Windows 2008 R2 x64 - SQL Server 2008 R2 x64

IIS中的FastCGI设置:

代码语言:javascript
复制
Instance MaxRequests = 200
Max Instances = 16
Activity Timeout = 70
Idle Timeout = 300
Queue Length = 1000
Rapid Fails PerMin = 10
Request Timeout = 90

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

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

有人知道吗?请帮帮我!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-04 23:46:55

我将在这里暗地里刺探,并假设这是由于会话锁定造成的。

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

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

您可以通过使用两个完全不同的浏览器来模拟两个用户(一个运行报告,另一个访问站点)来验证这一点。如果工作正常,您可以非常确定这是由于会话锁定。

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

  1. 不要为报表脚本启动会话(但这也意味着未经授权的用户可能会尝试运行您的报表脚本)
  2. 在您的繁重工作开始之前,通过在验证用户身份后使用session_write_close()关闭会话。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12266559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档