【问题标题】:Why cannot Apache handle multiple requests at the same time?为什么 Apache 不能同时处理多个请求?
【发布时间】:2016-05-25 08:15:54
【问题描述】:

我安装了 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_write_close() 应该防止与会话相关的等待,但是...是否需要会话才能重现该问题?或者,换句话说,如果您删除session_start(),它会按预期工作吗?您的问题表明根本不需要会话,但我想知道您为什么提到。
  • 没有session_start() 代码根本不会并发执行,请求一次处理一个。使用session_start(),先处理第一个请求,然后并发执行其余请求。
  • 我提到它们是因为有人认为这可能是与会话相关的问题。
  • 你能解决这个问题吗?好像我有类似的问题。我将 php 7 与(xampp 3.2.2)一起使用。

标签: php apache ampps


【解决方案1】:

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

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

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

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

【讨论】:

  • 我浏览了文档并配置了 MPM,但仍然无法正常工作。 session_write_close() 一次适用于 6 个请求。前 6 个请求完成后处理后 6 个请求。
  • 我正在为我的应用程序使用 codeigniter 框架,并且我尝试在同一浏览器的 3 个选项卡中运行相同的 url(以导入一些数据),以为它会同时运行,但事实并非如此。第二和第三个请求正在等待第一个完成。因此,在阅读完本文后,我尝试在 3 个不同的浏览器上运行它,并认为它可能是与会话相关的锁定并让它同时运行。谢谢!
  • 这可以提供一些代码吗?我试过了,但没有用。 @vkGunasekaran 我有同样的工作要做。在第一个选项卡中,我正在运行导入数据脚本,在第二个选项卡中,我想从数据库日志表中查看进度。但它仅在导入数据脚本完成时加载。
【解决方案2】:

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

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

【讨论】:

【解决方案3】:

操纵你的会话,写在 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

【讨论】:

  • 这正是我所需要的。我正在使用 PHP 流式传输文件,并且流式传输请求阻止我向同一用户发出另一个请求。事实证明,会话阻止了我提出另一个请求。
【解决方案4】:

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

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

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

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

【讨论】:

    【解决方案5】:

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

    1. mpm_prefork:这个处理模块产生进程,每个进程都有一个线程来处理请求。每个孩子可以处理一个 一次连接。
    2. mpm_worker:这个模块产生可以管理多个线程的进程。这些线程中的每一个都可以处理单个 连接。由于线程多于进程,这也意味着新连接可以立即占用空闲线程,而不必等待空闲进程。
    3. mpm_event: 这个模块在大多数情况下类似于worker模块 情况,但经过优化以处理保持活动连接。什么时候 使用worker MPM,一个连接将持有一个线程,而不管 是否主动提出请求,只要 连接保持活动状态。

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

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

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

        AcceptFilter http none
        EnableSendfile Off 
        EnableMMAP off 
        

        【讨论】:

          【解决方案8】:

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

          【讨论】:

          • 我一开始没用过。正如我所说,除了sleep(10),我的文件中没有任何内容
          猜你喜欢
          • 2011-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-12
          • 2012-09-21
          • 1970-01-01
          • 2010-10-29
          相关资源
          最近更新 更多