PHP 请求“排队”

Posted

技术标签:

【中文标题】PHP 请求“排队”【英文标题】:PHP requests "queueing" 【发布时间】:2011-06-16 06:46:11 【问题描述】:

我有以下问题:当执行非常简单的 php 脚本时,例如这个:

<?php
echo "1";
sleep(10);
echo "2";
?>

并在多个选项卡中打开它同时,第一个选项卡在 10 秒内完成,但是秒等待 20 秒而不是 10 秒,所以我猜测请求以某种方式“排队”。 有什么想法可以让它们并行执行吗?

配置如下:LAMP栈,Ubuntu 10.10 64bit; Apache/2.2.14 (Unix) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1

我已经添加了

KeepAlive On
MaxKeepAliveRequests 0
MaxClients 512
MaxRequestsPerChild 100000

到httpd.conf,但除此之外,它是lampp自带的默认httpd.conf

【问题讨论】:

要么是标签搞砸了你,要么是你对它的误解,大多数网站同时有多个访问者,想象一下是否真的如此。 我意识到这一点,但我认为问题在于我的服务器配置而不是浏览器。 我不知道如何设置服务器来以这种奇怪的方式行事,任何开箱即用的人都不会这样做 我发现这可能是由会话变量引起的,但是我没有,所以应该不是问题 ***.com/questions/4653686/php-on-windows-and-blocks 【参考方案1】:

您提供的 http.conf 部分表明,您可以通过更详细地查看此文件来获得一些回报(MaxKeepAliveRequests 0 - 在此处设置更合理的限制)。

特别是,请查看您正在运行的服务器数量,例如

StartServers       5
MinSpareServers    2
MaxSpareServers    8
ServerLimit       64

这是在本地工作站上进行开发工作的保守设置。对于非常低容量的并发访问,它可能看起来像......

 StartServers       8
 MinSpareServers    5
 MaxSpareServers   20
 ServerLimit      256

【讨论】:

【参考方案2】:

当您使用 sessions 时,第二个请求无法在第一个请求关闭之前开始使用它。或者,只要您不再使用任何会话变量,就可以在第一个变量上使用 session_write_close()

【讨论】:

【参考方案3】:

很可能是浏览器问题。某些浏览器对到同一服务器的多个连接数有限制。使用 2 个选项卡排队连接似乎很低,所以也许是另一个原因,但值得检查一下浏览器的高级设置。

此外,您可能希望在 echo 函数之后添加输出刷新,并输出一些可以为您提供更多线索的内容 - 例如服务器时间。

打开终端窗口并跟踪访问日志也可以让您更好地了解正在发生的事情。

【讨论】:

我见过的每个选项卡浏览器都会给每个选项卡一个新的连接池 - 你需要找到一个非常旧的浏览器,它限制为 2 个并发连接 实际上,问题似乎与此接近。当我更改 URL 时,连接是并发的。我没有进一步调查,因为在现实生活中我的具体情况不会发生。最初的功劳归于 zerkms,但 zaf 是最接近真实答案的。 @KPetrov 谢谢。如果您可以通过投票来消除紧缩的投票,那么这将传播一些乐观情绪,而不是相反。【参考方案4】:

这可能会有所帮助:

  // function for small sleeps that dont take cpu cycles
  function microdelay($delay) 
    $UNUSED_PORT = 31238; //make sure this port isn't being used on your server
    @fsockopen("tcp://localhost", $UNUSED_PORT, $errno, $errstr, $delay);
  

  microdelay(.5); //500ms
  microdelay(.25); //250ms
  microdelay(2.25); //2250ms

【讨论】:

很有趣 - 但为什么你认为 Unix 系统上的睡眠调用会消耗 CPU 周期? 我很确定我在某处读到过它,但现在找不到源,似乎我弄错了。 ://

以上是关于PHP 请求“排队”的主要内容,如果未能解决你的问题,请参考以下文章

Sentinel流控-排队等待

如何防止 AJAX 请求排队? [复制]

独角兽请求排队

Web Api 请求在 IIS 上永远排队(状态:ExecuteRequestHandler)

使用 Mule 重新排队 JMS 请求

超时异常 - 请求排队?线程不够?