我有apache作为http服务器和php,我发送了大约5个来自浏览器的同时请求,这个php脚本有一个for循环,这需要很长时间才能完成,我看到所有并发请求都被阻止并按顺序提供。< / p>
如何为http请求服务的非阻塞行为配置apache或php而不是顺序服务行为?
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服务器顺序提供(apache 2.2,php 5.3)
<?php
for ($i = 1; $i < 500000; $i++) { //do some processing which takes some time
$sq = sqrt($i);
$val += $sq;
}
echo $val;
?>
答案 0 :(得分:4)
我遇到了类似的问题并发现Apache和PHP配置正确,但我的PHP脚本在特定资源上阻塞。就我而言,会话文件被锁定,每个请求需要在会话文件再次释放之前完成,并且可以提供新的请求。 (这篇文章更深入地解释了这个问题:http://konrness.com/php5/how-to-prevent-blocking-php-requests/)一旦我阻止会话阻塞,我开始看到人们期望的并行性。
答案 1 :(得分:2)
在apache.conf中使用以下指令
StartServers 3
MinSpareServers 5
MaxSpareServers 7
它将产生额外的进程,等待并发连接立即为它们提供服务。 根据您的需要调整数字。
答案 2 :(得分:1)
我在这个设置中使用php脚本中的for循环测试了请求
您创建了一个脚本,该脚本通过HTTP对内容进行顺序请求,并发现它们是按顺序提供的?
您没有显示您的代码。虽然可以在单个线程中实现基于事件的套接字客户端,但编码起来相当困难。即使是这种情况,如果内容没有出现按顺序处理,我仍然会感到惊讶,因为(在没有分块的情况下)每条消息都是完整的请求。
我看到所有并发请求都被阻止了
有许多地方存在互斥体 - 在每个php会话的基础上,在每个会话的基础上,甚至在你开始在你的代码中引入更多的那些之前,显然是候选人。
你没有提到这是什么版本的Apache,更重要的是没有提到正在使用的mpm引擎,也没有提到它是如何配置的,也没有提到它运行的操作系统让我认为你的测试是可能不是很复杂。
您的结论明确反驳了网络服务器的基本要求 - 它可以同时处理多个客户端。
如何为http请求服务的非阻塞行为配置apache或php
根据现有证据,您的测试/分析存在缺陷,它已经做到了。