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