php CURL 服务器响应慢的问题

用c++搭了个简单的http服务器,但是发现接收数据很慢,一个php服务器发送http请求,内容大概100k,千兆内网,百兆网卡,但总是需要1秒时间才能接受完请求报文,开始如下分析

先看接收的http服务器代码

clock_t start, end;
int ctn = 0;
start = clock();
for(;;)
{
	ctn++;
	DWORD EventCaused = WSAWaitForMultipleEvents(
           MAX_WSAEVENTS,	
           EventArray,  	
           FALSE,  	
           pGenericServer->PersistenceTO ? pGenericServer->PersistenceTO : WSA_INFINITE, 	   FALSE
        );
	result = WSAEnumNetworkEvents(s, Event, &NetworkEvents);
	if(NetworkEvents.lNetworkEvents & FD_READ)
	{
		result = WSARecv(s, &Buffers, dwBufferCount, &NumberOfBytesRecvd,
				&Flags,	NULL, NULL);
		if(pGenericServer->IsGet(szRequest))
		{
					. . .
		}else{
			if (!pGenericServer->IsComplete(szRequest)){
				continue;
			}
			end = clock();
			TRACE("recv cost:%d -- times:%d total-length:%d\n", end - start, ctn, szRequest.length());
		}
         }
}

对recv 进行时间累计分析,每次接收的recv消耗时间几乎为0,大部分时间耗在WSAWaitForMultipleEvents上,对每次循环消耗时间进行分析,总是接收第一次数据包后要等待几乎一秒(前后差几毫秒)时间。

进一步检查每次接收到的数据,第一次服务器只发送了请求头,而等待1秒后才开始接收服务器内容,因而怀疑是php服务器的卡顿导致,检查php服务器代码, 用的curl_exec()执行请求发送,网上搜索php调用curl慢,主要问题都是指向DNS, ipv6解析,但将curl响应设置更改后仍然没有改观,于是去看php的curl官网解释http://php.net/manual/zh/function.curl-setopt.php,看有什么可能的影响设置,比如TCP数据包大小优化等待,但始终不得解决。

再回头看接收到的请求头,看到了陌生的一行,Except:100-continue, 网上一查,是HTTP 1.1协议里当请求方的请求包大于1024字节,会先发送 该句请求头,以期确认服务器具备大于1024字节数据包处理能力,然后才发送剩余数据,而我们的发送方的请求包必然大于1024字节,故而crul先发送该询问,等待服务器超时(默认1秒)后才开始发送剩余数据,所幸curl考虑到该协议各服务器支持不是很规范,所以当curl等待超时后没有直接放弃传输,而是继续传输,综合出现了上述情况。

更多信息见原博客:

http://www.straka.cn/blog/php_curl_low_response_bugfix/

参考:

解决PHP CURL中Expect:100-continue问题:  http://www.pooy.net/solve-expect100-continue-problems-in-php-curl.html

CURL_SETOPT:  http://php.net/manual/zh/function.curl-setopt.php

猜你喜欢

转载自blog.csdn.net/atp1992/article/details/80783262