Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为非阻塞http请求配置PHP或Apache_Php_Apache_Nonblocking_Http Request - Fatal编程技术网

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

如何为非阻塞http请求配置PHP或Apache,php,apache,nonblocking,http-request,Php,Apache,Nonblocking,Http Request,我使用apache作为http服务器和php,我从浏览器向这个php脚本发送了大约5个并发请求,这个脚本有一个for循环,需要很长时间才能完成,我看到所有并发请求都被阻塞并按顺序提供服务 如何将apache或php配置为http请求服务的非阻塞行为,而不是顺序服务行为 I know that Tomcat server http connector can tune using following server parameters – Threads (maxThreads)

我使用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服务器按顺序提供(apache 2.2、PHP5.3)


在apache.conf中使用以下指令

StartServers          3
MinSpareServers       5
MaxSpareServers       7
它将产生额外的进程,等待并发连接立即为它们提供服务。 根据需要调整数字

我在这个设置中使用php脚本中的for循环测试了请求

您创建了一个脚本,该脚本通过HTTP对内容进行顺序请求,并发现它们是按顺序提供的

您尚未显示代码。虽然可以在单个线程中实现基于事件的套接字客户机,但编写代码却相当困难。即使是这样,如果内容看起来没有按顺序处理,我仍然会感到惊讶,因为(在没有分块的情况下)每条消息都是一个完整的请求

我看到所有并发请求都被阻止了

在很多地方都有互斥体——在每个php会话的基础上,在每个ssl会话的基础上,甚至在您开始在代码中引入更多互斥体之前,互斥体都是明显的候选对象

你没有提到这是什么版本的Apache,更重要的是没有提到正在使用什么mpm引擎,也没有提到它是如何配置的,也没有提到它运行在什么操作系统上,这让我觉得你的测试可能不是很复杂

您的结论明确反驳了Web服务器的一个基本要求,即它可以同时处理多个客户端

如何为http请求服务的非阻塞行为配置apache或php


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

我遇到了一个类似的问题,发现Apache和PHP配置正确,但是我的PHP脚本阻塞了特定的资源。在我的例子中,是会话文件被锁定,每个请求都需要在会话文件再次释放并可以服务于新请求之前完成。(这里有一篇文章更深入地解释了这个问题:)一旦我阻止了会话阻塞,我就开始看到人们期望的并行性。

我不知道你到底想做什么,但我想你应该使用cronjob,或者一个专用的作业服务器(比如gearman)。事实上,我希望同时处理请求,我明白了,但问题是:为什么?长时间运行的脚本不应该从浏览器中调用(通常;当然也有例外)。例如,您可以使用浏览器触发作业(->推送至gearman),并在不同页面上显示此作业的状态。如果这是答案,则这是一个非常糟糕的问题。我从浏览器向此php脚本发送了大约5个同时请求,该脚本有一个For循环,这需要很长时间才能完成
StartServers          3
MinSpareServers       5
MaxSpareServers       7