用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
<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
<http://www.pooy.net/solve-expect100-continue-problems-in-php-curl.html>

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

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信