所以,长话短说,我有一个使用MVC Web API作为后端的AJAX应用程序.然而,客户端从不同的域调用并使用PHP代理文件来解决跨域请求问题.
但是,使用PHP代理,Web API会使用100 ContinueHTTP标头响应某些请求,并且任何获取此请求的请求都需要花费过多的时间才能完成(我们说的最多2分钟左右)并且还可以返回无效的响应.
这似乎是cURL的一个已知问题,解决方法通常被引用为插入以下行以删除cURL请求中的expect:100标头
不幸的是,解决方案对我来说似乎难以捉摸:
$headers = getallheaders();
$headers_new = "";
foreach($headers as $title => $body) {
$headers_new[] = $title.": ".$body;
}
//$headers_new[] = 'Expect:';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers_new);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:') );
Run Code Online (Sandbox Code Playgroud)
此代码有效,但删除了所有其他标头(这对我来说是不可行的,因为我使用HTTP基本身份验证头来通过API进行身份验证).您可能还会注意到我尝试将其添加Expect:到现有标头中,但这对我也没有帮助.
如何维护现有标头,还可以防止cURL期望100继续?
你将不得不原谅相当大的代码块,但我相信这是对我的问题的近乎最小的再现.问题不是孤立的,example.com而是持续存在于许多其他网站上.
如果我有4个线程主动发出网络请求,curl工作100%罚款.
如果我再添加一个线程,该线程需要大约10倍的时间来执行.我觉得我必须错过一些明显的东西,但它现在逃脱了我.
更新更多信息:这些测试位于虚拟机中.与机器可用的内核数量无关,其中四个请求需要大约100毫秒,其余请求大约需要5500毫秒.
更新2:实际上,我在一个方面是错的,它并不总是4/ n-4分布 - 当我改为4核心时,有时我得到一个不同的结果分布(在1核上运行至少看起来相对一致) - 这里是一个当线程在4核VM上运行时返回其延迟(ms)而不是其http代码时的结果片段:
191 191
198 198 167
209 208 202 208
215 207 214 209 209
5650 213 5649 222 193 207
206 201 164 205 201 201 205
5679 5678 5666 5678 216 173 205 175
5691 212 179 206 5685 5688 211 5691 5680
5681 199 210 5678 5663 213 5679 212 5666 428
Run Code Online (Sandbox Code Playgroud)
更新3:我从头开始构建curl和openssl,删除锁定(因为openssl 1.1.0g不需要它)并且问题仍然存在.(通过以下方式进行的完整性检查/验证):
std::cout << …Run Code Online (Sandbox Code Playgroud) Python的BaseHTTPRequestHandler对于通过邮寄发送的表单存在问题!
我见过其他人问同样的问题(为什么GET方法比POST更快?),但我的情况时差太大(1秒)
Python服务器:
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import datetime
def get_ms_since_start(start=False):
global start_ms
cur_time = datetime.datetime.now()
# I made sure to stay within hour boundaries while making requests
ms = cur_time.minute*60000 + cur_time.second*1000 + int(cur_time.microsecond/1000)
if start:
start_ms = ms
return 0
else:
return ms - start_ms
class MyServer(BaseHTTPRequestHandler, object):
def do_GET(self):
print "Start get method at %d ms" % get_ms_since_start(True)
field_data = self.path
self.send_response(200)
self.end_headers()
self.wfile.write(str(field_data))
print "Sent response at %d ms" % get_ms_since_start()
return
def …Run Code Online (Sandbox Code Playgroud) 我正在使用 CURLOPT_POST 发送 https 消息。在运行过程中,我的应用程序卡在:
期望:100-继续
完成等待 100-继续