我有apache作为http服务器和php,我从浏览器向这个php脚本同时发送了大约5个请求,这个脚本有一个for循环,需要很长时间才能完成,我看到所有并发请求都被阻止并按顺序提供。
如何将apache或php配置为http请求服务的非阻塞行为,而不是顺序服务行为?
I know that Tomcat server http connector can tune using following server parameters
– Threads (maxThreads)
– Keep alive requests (maxKeepAliveRequests)
– TCP Backlog (acceptCount)
– connectionTimeout
– Socket buffers
- Use different connectors (nio, apr, bio)
etc...
php代码片段,针对5个并发请求进行了测试,但由web服务器(apache2.2、php5.3)按顺序提供服务
<?php
for ($i = 1; $i < 500000; $i++) { //do some processing which takes some time
$sq = sqrt($i);
$val += $sq;
}
echo $val;
?>
我遇到了一个类似的问题,发现Apache和PHP配置正确,但我的PHP脚本在特定的资源上被阻塞了。在我的情况下,是会话文件被锁定,每个请求都需要完成,然后会话文件才能再次空闲,并可以提供新的请求。(以下是一篇更深入地解释这个问题的文章:http://konrness.com/php5/how-to-prevent-blocking-php-requests/)一旦我阻止了会话的阻塞,我就开始看到人们所期望的并行性。
在apache.conf 中使用以下指令
StartServers 3
MinSpareServers 5
MaxSpareServers 7
它将产生额外的进程,等待并发连接立即为它们提供服务。根据需要调整数字。
我在这个设置中使用php脚本中的for循环测试了请求
您创建了一个脚本,通过HTTP对内容进行顺序请求,并发现它们是按顺序提供的?
您尚未显示代码。尽管可以在单个线程中实现基于事件的套接字客户端,但这将很难编码。即使是这种情况,如果内容没有出现以按顺序处理,我仍然会感到惊讶,因为(在没有分块的情况下)每条消息都将是一个完整的请求。
我看到所有并发请求都被阻止了
在很多地方都有互斥体——在每个php会话的基础上,在每个ssl会话的基础之上,甚至在您开始在代码中引入更多互斥体之前,互斥体都是显而易见的候选者。
你没有提到这是Apache的哪个版本,更重要的是,没有提到正在使用什么mpm引擎,也没有提到它是如何配置的,也没有提及它在什么操作系统上运行,这让我认为你的测试可能不是很复杂。
您的结论明确反驳了Web服务器的一个基本要求,即它可以同时处理多个客户端。
如何配置apache或php以实现http请求服务的非阻塞行为
根据现有证据,你的测试/分析存在缺陷,它已经做到了。