PHP请求“排队”

时间:2011-01-27 02:47:54

标签: php apache

我遇到以下问题:执行非常简单的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

4 个答案:

答案 0 :(得分:1)

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

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

打开终端窗口并跟踪访问日志也可以让您更好地了解最新情况。

答案 1 :(得分:0)

这可能会有所帮助:

  // 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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您提供的http.conf部分建议您可以通过查看此文件获得更多细节(MaxKeepAliveRequests 0 - 在此处设置更合理的限制)。

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

StartServers       5
MinSpareServers    2
MaxSpareServers    8
ServerLimit       64

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

 StartServers       8
 MinSpareServers    5
 MaxSpareServers   20
 ServerLimit      256