为什么Apache不能同时处理多个请求?

时间:2016-05-25 08:15:55

标签: php apache ampps

我安装了AMPPS。

我的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";

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

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

8 个答案:

答案 0 :(得分:17)

Apache肯定可以同时处理多个请求,你的apache配置肯定会出现问题。

这取决于您使用的Apache版本及其配置方式,但常见的默认配置使用多个具有多个线程的工作程序来处理同时发出的请求。请参阅http://httpd.apache.org/docs/2.2/mod/worker.html了解其工作原理。

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

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

答案 1 :(得分:4)

可能因为会话锁定。如果您不需要编辑会话变量,请将其关闭。

http://php.net/manual/en/function.session-write-close.php

答案 2 :(得分:1)

操纵你的会话写在script.php的开头

$ mkdir d
$ sudo sh -c 'chown root:root d && chmod 700 d'

$ [[ -d d && ! -r d ]] && echo "d exists but is not readable"
d exists but is not readable

答案 3 :(得分:0)

您是否尝试使用不同的浏览器标签/窗口/实例进行同时调用?

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

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

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

答案 4 :(得分:0)

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

  1. mpm_prefork:此处理模块生成每个处理请求的单个线程的进程。每个孩子都可以处理一个 一次连接。
  2. mpm_worker:此模块生成可以管理多个线程的进程。这些线程中的每一个都可以处理一个 连接。由于线程多于进程,这也意味着新连接可以立即获取一个空闲线程,而不必等待一个空闲进程。
  3. mpm_event:此模块与大多数工作模块类似 情况,但优化,以处理保持活动连接。什么时候 使用worker MPM,连接将保持一个线程,无论如何 是否正在积极地提出请求 连接保持活跃。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我遇到了类似的问题。连接到服务器时,多个请求一直随机挂起。

试图更改mpm配置,没有用。

最后,这似乎为我解决了这个问题。 (来自https://serverfault.com/a/680075

AcceptFilter http none
EnableSendfile Off 
EnableMMAP off 

答案 7 :(得分:-1)

您可以将会话存储从文件移动到数据库 - 比您可以一次性请求文件而无需等待 - 或 - 如果您不需要在脚本中使用会话将其关闭(请勿使用{{ 1}})