2016-05-25 42 views
6

我安装了AMPPS。为什么Apache不能同时处理多个请求?

我的Apache服务器不能同时处理多个php请求(例如,如果我多次调用localhost/script.php,它们将按连续顺序处理)。 script.php只包含<?php sleep(10); ?>

我看过MaxClients指令负责并发访问配置,但是在我的httpd.conf中完全没有。

禁用Xdebug并将session_write_close();写入脚本的开头不起作用。

当我加入session_start();到文件的开头,看起来像我的代码:

<?php 

session_start(); 
session_write_close(); 
sleep(10); 
phpinfo(); 

echo "Done"; 

当进行5个请求localhost/script.php,最后4等待第一个结束,然后同时结束。

请帮我解决问题。如果缺少帮助我解决此问题的任何信息,请通知我并添加它。

+0

试试这个:http://stackoverflow.com/questions/3389496/how-do-you-increase-the-max-number-of-concurrent-connections-in-apache – ExtremsX

+0

'session_write_close()'应该阻止会话相关的等待,但是......需要重新讨论这个问题?换句话说,如果你删除'session_start()',它是否按预期工作?你的问题表明会议不是必需的,但我想知道你为什么提到。 –

+1

没有'session_start()'代码不会同时执行,请求一次处理一个。通过'session_start()',第一个请求在别人之前被处理,然后其余的请求被同时执行。 – nicks

回答

10

apcahe肯定可以同时处理多个请求,在你的apache配置中肯定会出错。

这取决于您使用的是哪个版本的Apache以及它如何配置,但常见的默认配置使用多个工作线程和多个线程来处理同时发生的请求。请参阅http://httpd.apache.org/docs/2.2/mod/worker.html了解其工作原理。

你面对它的原因是: 某处存在某种锁定 - 例如,如果两个请求来自同一客户端,并且您在PHP中使用基于文件的会话:脚本正在执行,会话被“锁定”,这意味着服务器/客户端必须等到第一个请求完成(并且解锁文件)才能够使用该文件为第二个用户打开会话。

请求来自同一个客户端和同一浏览器;在这种情况下,大多数浏览器都会对请求进行排队,即使服务器端没有产生这种行为。

-1

您可以将会议从文件存储到数据库 - 比你将有可能一次全部申请文件,而无需等待 - 或 - 如果你没有在你的脚本需要会话关闭它(请勿使用session_start();

+1

我还没有使用过。正如我所说,除了睡眠(10)以外,我没有任何文件 – nicks

0

您是否尝试过使用不同的浏览器选项卡/窗口/实例进行同时调用?

Apache是​​多线程的,所以它绝对可以处理你的并行请求。看来你有一些事情要检查:

  • 请用适当的客户端请求的测试(如Apache基准) - 看看https://httpd.apache.org/docs/2.4/programs/ab.html

  • 检查阿帕奇您的设置。有一些错误的设置可能会产生奇怪的行为,例如一次请求单个请求。看看httpd.conf中的fork和worker参数。建议:使用所有默认参数进行测试。

0

Apache提供了多种多处理模块(Apache调用这些MPM),它们指示如何处理客户端请求。基本上,这允许管理员轻松地交换其连接处理架构。它们是:

  1. mpm_prefork:该处理模块产生进程通过单个线程每处理请求。每个小孩一次只能处理一个 连接。
  2. mpm_worker:该模块产生可以管理多个线程的进程。每个线程都可以处理单个连接。由于线程数量多于进程,这也意味着新连接可以立即获得一个空闲线程,而不必等待一个空闲进程。
  3. mpm_event:该模块与大多数 情况下的工作模块类似,但经过优化以处理保持活动连接。当 使用工作者MPM时,连接将持有线程,无论 是否只要 连接保持活动状态,都会主动进行请求。
0

尝试在调用会话关闭之前在会话中包括sleep和phpinfo。 因为它看起来像会话(所有五个被视为相同,并终止与第一个被终止)。也许验证会话ID是否相同。 通过保持会话打开,您可以看到它们同时处理。

相关问题