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

ep6jt1vc  于 2023-05-01  发布在  Apache
关注(0)|答案(9)|浏览(146)

我安装了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个请求等待第一个请求结束,然后并发结束。
请帮我解决这个问题。如果缺少帮助我解决此问题所需的任何信息,请通知我,我将添加它。

vnjpjtjt

vnjpjtjt1#

Apache可以同时处理多个请求,但在Apache配置中肯定会出现问题。
这取决于您使用的Apache版本以及它的配置方式,但常见的默认配置使用多个工作线程和多个线程来处理并发请求。请参阅http://httpd.apache.org/docs/2.2/mod/worker.html了解其工作原理。
你面对它的原因是:在某个地方有一些锁-这可能发生,例如,如果两个请求来自同一个客户端,并且您正在使用PHP中基于文件的会话:当脚本被执行时,会话被“锁定”,这意味着服务器/客户端将不得不等待直到第一请求完成(并且文件被解锁),以便能够使用该文件为第二用户打开会话。
请求来自同一客户端和同一浏览器;在这种情况下,大多数浏览器将请求排队,即使服务器端没有产生这种行为。

x3naxklr

x3naxklr2#

可能是因为会话锁定。当您不需要编辑会话变量时,请关闭它。
http://php.net/manual/en/function.session-write-close.php

t3psigkw

t3psigkw3#

操纵你的会话,写在脚本的开始。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
rbpvctlc

rbpvctlc4#

您是否尝试过使用不同的浏览器选项卡/窗口/示例进行同时调用?
Apache是多线程的,因此,它绝对可以处理您的并行请求。看来你有一些东西要检查:

  • 向适当的客户端发出请求进行测试(如apache基准测试)-查看https://httpd.apache.org/docs/2.4/programs/ab.html
  • 检查你在Apache上的设置。有一些错误的设置会产生奇怪的行为,比如一次一个请求。看看httpd上的fork和worker参数。conf.建议:使用所有默认参数进行测试。
qaxu7uf2

qaxu7uf25#

Apache提供了各种多处理模块(Apache称之为MPM),这些模块规定了如何处理客户端请求。基本上,这允许管理员轻松地交换其连接处理架构。这些措施是:
1.**mpm_prefork:**此处理模块生成一个进程,每个进程有一个线程来处理请求。每个子节点一次可以处理一个连接。
1.**mpm_worker:**该模块生成的进程可以管理多个线程。这些线程中的每一个都可以处理单个连接。由于线程比进程多,这也意味着新连接可以立即使用空闲线程,而不必等待空闲进程。
1.**mpm_event:**该模块在大多数情况下与worker模块类似,但针对处理keep-alive连接进行了优化。当使用工作MPM时,只要连接保持活动,连接将保持线程,而不管是否正在主动发出请求。

5m1hhzi4

5m1hhzi46#

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

azpvetkf

azpvetkf7#

我也遇到过类似的问题。多个请求在连接到服务器时随机挂起。
已尝试更改mpm配置,但没有用。
最后,这一个似乎解决了我的问题。(来自https://serverfault.com/a/680075

AcceptFilter http none
EnableSendfile Off 
EnableMMAP off
wz1wpwve

wz1wpwve8#

Artisan是单线程的!只是不要为您的项目服务与工匠。相反,创建一个路由到你的laravel/public或者你可以使用Laravel Octan,这是非常强大的。

6za6bjd0

6za6bjd09#

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

相关问题