2

我有 apache 作为 http 服务器和 php,我从浏览器向这个 php 脚本发送了大约 5 个并发请求,该脚本有一个 for 循环,这需要很长时间才能完成,我看到所有并发请求都被阻止并按顺序提供服务。

如何为 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...

测试了 5 个并发请求的 php 代码片段,但由 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;
?>
4

3 回答 3

5

我遇到了类似的问题,发现 Apache 和 PHP 配置正确,但是我的 PHP 脚本阻塞了特定资源。就我而言,是会话文件被锁定,并且每个请求都需要在会话文件再次空闲并可以提供新请求之前完成。(这里有一篇文章更深入地解释了这个问题:http: //konrness.com/php5/how-to-prevent-blocking-php-requests/)一旦我阻止了会话阻塞,我开始看到并行性人们会期望。

于 2012-08-07T12:41:15.800 回答
2

在 apache.conf 中使用以下指令

StartServers          3
MinSpareServers       5
MaxSpareServers       7

它将产生额外的进程等待并发连接以立即为它们服务。根据您的需要调整数字。

于 2012-07-31T12:09:01.843 回答
1

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

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

你还没有显示你的代码。尽管可以在单个线程中实现基于事件的套接字客户端,但这将很难编码。即使是这种情况,如果内容似乎没有按顺序处理,我仍然会感到惊讶,这仅仅是因为(在没有分块的情况下)每条消息都是一个完整的请求。

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

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

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

您的结论明确驳斥了网络服务器的基本要求——它可以同时处理多个客户端。

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

根据您的测试/分析存在缺陷的可用证据,它已经这样做了。

于 2012-07-31T12:47:51.307 回答