繁体   English   中英

如何配置PHP或Apache以防止非阻塞HTTP请求

[英]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...

经过测试的5个并发请求的php代码段,但由网络服务器按顺序提供(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;
?>

我遇到了一个类似的问题,发现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请求服务的非阻止行为

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM