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


How to configure PHP or Apache for non blocking http requests

我有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请求服务的非阻塞行为

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