为什么 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个等待第一个结束然后并发结束。
请帮我解决这个问题。如果缺少帮助我解决此问题所需的任何信息,请通知我,我会添加它。
可能是因为会话锁定。当您不需要编辑会话变量时,将其关闭。
您可以将会话存储从文件移动到数据库 - 这样您就可以一次请求所有文件而无需等待 - 或者 - 如果您的脚本中不需要会话,请将其关闭(不要使用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)来指示如何处理客户端请求。基本上,这允许管理员轻松更换其连接处理架构。它们是:
- mpm_prefork: 这个处理模块产生一个进程,每个进程都有一个线程来处理请求。每个 child 可以处理一个
一次连接。
- mpm_worker: 这个模块产生了可以管理多个线程的进程。这些线程中的每一个都可以处理一个
connection.Since线程多于进程,这也意味着新连接可以立即占用空闲线程,而不必等待空闲进程。
- 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
我安装了 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个等待第一个结束然后并发结束。
请帮我解决这个问题。如果缺少帮助我解决此问题所需的任何信息,请通知我,我会添加它。
可能是因为会话锁定。当您不需要编辑会话变量时,将其关闭。
您可以将会话存储从文件移动到数据库 - 这样您就可以一次请求所有文件而无需等待 - 或者 - 如果您的脚本中不需要会话,请将其关闭(不要使用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)来指示如何处理客户端请求。基本上,这允许管理员轻松更换其连接处理架构。它们是:
- mpm_prefork: 这个处理模块产生一个进程,每个进程都有一个线程来处理请求。每个 child 可以处理一个 一次连接。
- mpm_worker: 这个模块产生了可以管理多个线程的进程。这些线程中的每一个都可以处理一个 connection.Since线程多于进程,这也意味着新连接可以立即占用空闲线程,而不必等待空闲进程。
- 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