【问题标题】:Why does apache not process multiple requests from the same browser simultaneously为什么apache不能同时处理来自同一个浏览器的多个请求
【发布时间】:2011-04-07 02:42:56
【问题描述】:

我不太确定如何正确表达这个问题,所以我将从我遇到的场景开始。

我的网络应用程序中的一些处理时间比我希望用户等待再次控制页面的时间要长,因此我决定通过 ajax 请求对其进行处理。

问题是,即使我将此请求卸载到 ajax 请求中,在原始处理器繁重的请求完成之前,apache 似乎不会处理任何进一步的请求。

我最初想知道如何解决这个问题,但后来决定总的来说这可能是个坏主意。

但是,我仍然很好奇是否有人知道 apache 为什么会这样,以及是什么(如果有的话)配置指令控制它。我最初的想法是 KeepAlive,但禁用它似乎并没有改变行为。

如果有影响,我正在通过 mod_php 运行 php。

感谢您在正确的方向上提供的任何帮助!

【问题讨论】:

  • ServerFault 更有可能解决这个问题。
  • 谢谢 amber,你可能是对的,我应该在那里发帖 - 但事实证明我对问题的误解让我找到了正确的地方 :-)

标签: php http apache2 xmlhttprequest


【解决方案1】:

您是否使用基于文件的会话? PHP 将为每个请求锁定会话文件并保持该锁定,直到您执行session_write_close() 或脚本终止/退出。这样做的副作用是所有请求都变成串行的,因为它们都在争夺同一个资源(会话文件)。

【讨论】:

  • 在大多数正常的生产系统中,您可能会使用另一个会话处理程序,例如 memcached。但是,是的,这是一种可能性。
  • 一定是这样 - 据我所知,会话是基于文件的。听起来是尝试迁移到 memcached 的好时机!谢谢!
  • 在进入 memcached 之前,您可以在开始时完成所有基于会话的工作。然后关闭它。将会话变量复制到一个临时变量中,以便您可以将其关闭,然后如果您需要稍后设置会话值,请打开它并进行更改,然后快速关闭它。我也将此添加到下面的答案中。
【解决方案2】:

我确定这是会话文件。我也有同样的问题。我运行一个很长的请求,例如 PHPMyAdmin SQL 插入,它需要几分钟才能处理。在处理过程中,我尝试在同一个浏览器中打开一个新选项卡并转到我网站上的任何页面,并且在完成原始 PHPMyAdmin 请求之前它不会去那里。 如果我在 Chrome 中打开一个隐身窗口,它是同一个浏览器,它可以正常工作。如果我在任何其他浏览器中打开该网站,那很好。 所以它可能是基于文件的会话,这是 PHP 的默认设置。

其他人提到要使用 memcached。您还可以将会话保存在数据库中。 在必须去 memcached 之前,你可以在一开始就做所有基于会话的东西。将会话变量复制到临时变量中,以便您可以关闭它然后关闭它。然后,如果您稍后需要设置会话值,请打开它并进行更改,然后快速关闭它。

【讨论】:

  • 遇到了同样的问题。尽快关闭会话解决。
【解决方案3】:

你能指出它是 apache 的证据吗?除非您的 apache 设置不是最佳的,否则您的页面等待很可能是其他原因,也许您已将 ajax 调用设置为 非异步

【讨论】:

  • 感谢您的建议——我没有证据表明它是 apache——除了我不知道它还会是什么。我使用 open('GET',url,true),所以调用应该是异步的
猜你喜欢
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 2013-12-26
相关资源
最近更新 更多