2010-03-13 65 views
1

美好的一天!整个网站在一个页面正在等待阻止操作时被阻止(PHP,ASP.NET)。为什么?

我发现了LAMP堆栈和ASP.NET的有趣行为。

场景:

有一个在2-3分钟内执行任务页面(使HttpWebRequest的用于ASP.NET和卷曲的PHP)。处理该页面时,不会处理来自同一浏览器的对该虚拟主机的所有其他请求(即使我在一台机器上使用不同的浏览器)。我使用两个用PHP和C#编写的页面。

我已经在Windows和Debian上使用Apache + PHP在mod_php和fast_cgi模式下进行了测试。 对于ASP.NET,我使用集成模式下的IIS6(带有专用应用程序池和默认应用程序池)和IIS7。

我知道最好是使用异步调用这样的事情,但我只是好奇为什么单个页面阻止整个站点,而不仅仅是处理请求的线程?

在此先感谢!

回答

1

看来你打开标准的php会话,直到请求结束才打开。这意味着会话文件被锁定。如果您不需要会话数据,请尽快使用session_write_close()。

+0

是的你是对的,通过'session_write_close()'解决了这个问题,我忘了在这里发布解决方案。谢谢! – artvolk 2011-12-13 14:31:39

0

我不认为它是封锁网站;我怀疑开放连接会阻止客户端发出更多请求。您是否证明其他机器在长时间运行的请求正在进行时无法使用该站点?

+0

我已经试图从同一台机器上使用其他浏览器(不是另一个窗口,另一个程序)。据我了解,这应该为新请求创建另一个处理线程。 – artvolk 2010-03-14 10:23:07

+0

除非您的本地计算机已连接到同一端口上的同一服务器,否则不会。我重复我的问题:你证明了*其他机器*不能使用该网站吗?我认为你没有证明服务器被阻止。 – 2010-03-14 11:43:55

+0

我已经从站在附近的其他PC进行测试。当我的网页执行HttpWebRequest时,该网站也被屏蔽了。 两台计算机都落后于同一个NAT盒 – artvolk 2010-03-14 12:57:06

0

如果你只看到一个请求来到应用程序,我能想到的唯一的事情就是管道中某处的全局锁。

该锁可以是显式的(您编写锁语句)或隐式的。如果您可以看到多个请求 - 这可能是由于线程池耗尽。

请记住,除了用于处理传入Web请求的线程数量上限之外,还会通过HttpWebRequest单独限制同时传出的Web请求的数量,默认情况下此限制非常低 - 如果我记住每个CPU正确2个。我不记得web.config中设置的名称,但会尝试查找它。

在任何情况下发布的代码将会给我们一个更好的机会,以帮助您

+0

谢谢你的回应,你的意思是这样的: http://support.microsoft.com/kb/821268 关于PHP和Apache 可是什么?为什么相同的行为?.. – artvolk 2010-03-14 10:26:49

0

在调试ASP.NET应用程序,我肯定注意到了这个问题,但我一直只是认为这是一个调试配置问题。你是否在释放模式下构建了所有东西,并且在web.config中关闭了调试功能?

+0

是的,我有调试关闭。 – artvolk 2010-03-14 10:22:00