Php Server CUrl Low Response Bugfix

php CURL 服务器响应慢的问题

Abstract: I wrote a http server in c++, but when I receive message from a php server, it takes one more seconds, and coincidentally, just over one seconds. After hours searching, the problems comes from the way php server send data by curl, when curl sends large package(over 1024bytes), it will send a ask header to make sure the receiver can handle the large package, but the receiver I impelemented didn’t response correctly to the query, thus cause transmission delay.

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

先看接收的http服务器代码

对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等待超时后没有直接放弃传输,而是继续传输,综合出现了上述情况。

参考:

解决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

发表评论