如何为非阻塞http请求配置PHP或Apache

时间:2012-07-31 12:04:52

标签: php apache nonblocking http-request

我有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;
?>

3 个答案:

答案 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

根据现有证据,您的测试/分析存在缺陷,它已经做到了。