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

Why cannot Apache handle multiple requests at the same time?

我安装了 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个等待第一个结束然后并发结束。

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

可能是因为会话锁定。当您不需要编辑会话变量时,将其关闭。

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

您可以将会话存储从文件移动到数据库 - 这样您就可以一次请求所有文件而无需等待 - 或者 - 如果您的脚本中不需要会话,请将其关闭(不要使用session_start();)

您是否尝试过使用不同的浏览器进行同时调用 tabs/windows/instances?

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

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

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

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

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

你面对它的原因是: 某处有一些锁——这可能发生,例如,如果两个请求来自同一个客户端,并且您在 PHP 中使用基于文件的会话:在执行脚本时,会话是 "locked",这意味着 server/client 必须等到第一个请求完成(并且文件解锁)才能使用该文件为第二个用户打开会话。

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

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

  1. mpm_prefork: 这个处理模块产生一个进程,每个进程都有一个线程来处理请求。每个 child 可以处理一个 一次连接。
  2. mpm_worker: 这个模块产生了可以管理多个线程的进程。这些线程中的每一个都可以处理一个 connection.Since线程多于进程,这也意味着新连接可以立即占用空闲线程,而不必等待空闲进程。
  3. mpm_event:这个模块和worker模块在大多数情况下是相似的 情况下,但已优化以处理 keep-alive 个连接。什么时候 使用 worker MPM,一个连接将持有一个线程,无论 请求是否正在积极进行,只要 连接保持活动状态。

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

操纵您的会话,在 script.php

开始时写入
// manipulate writes, and unlock session file!
session_start();
$_SESSION['admin'] = 1;
$_SESSION['user'] = 'Username';
session_write_close(); // unlock session file, to another script can access

// start your script without php session block
sleep(30); 
echo $_SESSION['user'];

// another script can run without wait this script finish

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

尝试更改 mpm 配置,但没有用。

这个终于解决了我的问题。 (来自 https://serverfault.com/a/680075

AcceptFilter http none
EnableSendfile Off 
EnableMMAP off