17

我安装了 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";

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

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

4

8 回答 8

32

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

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

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

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

于 2016-06-08T13:59:01.190 回答
7

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

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

于 2016-05-25T08:20:00.823 回答
4

操纵你的会话,写在 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
于 2018-04-14T13:41:19.917 回答
0

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

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

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

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

于 2016-06-08T05:24:10.947 回答
0

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

  1. mpm_prefork:这个处理模块产生进程,每个进程都有一个线程来处理请求。每个孩子一次只能处理一个连接。
  2. mpm_worker:这个模块产生可以管理多个线程的进程。这些线程中的每一个都可以处理单个连接。由于线程多于进程,这也意味着新连接可以立即占用空闲线程,而不必等待空闲进程。
  3. mpm_event:该模块在大多数情况下类似于工作模块,但经过优化以处理保持活动连接。使用worker MPM时,只要连接保持活动状态,无论是否正在主动发出请求,连接都会保持线程。
于 2016-06-09T11:28:49.083 回答
0

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

于 2016-06-09T21:48:13.377 回答
0

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

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

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

AcceptFilter http none
EnableSendfile Off 
EnableMMAP off 
于 2018-07-15T17:39:33.747 回答
-1

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

于 2016-05-25T08:37:21.353 回答