2013-08-05 261 views
0

我有一个cURL请求,如果执行时没有Content-Length头,则会给我一个长度为411的错误。当我将$header[] = 'Content-Length: 0添加到我的标题数组中时,它会缓慢执行(约15秒)。使用POST cURL请求缓慢执行

我在不同的域上使用相同的代码没有任何问题。在这个域中,我不需要设置内容长度标题,也不会收到411错误。我在考虑Content-Length错误可能与问题有关,因为只有PUT请求应该给我这个错误。

这是我目前卷曲的要求:

$curl = curl_init(); 

$header[] = 'Authorization: Basic 123123'; 
$header[] = 'Accept: text/xml'; 
//$header[] = 'Content-Length: 0'; 

curl_setopt($curl, CURLOPT_POST, true); 
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($curl, CURLOPT_URL, $url); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); 
curl_setopt($curl, CURLOPT_HTTPHEADER, $header); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 

$output = curl_exec($curl); 
$error = curl_error($curl); 

编辑: 我已经改变了我CURLOPT_URL并添加CURLOPT_POSTFIELDS

curl_setopt($curl, CURLOPT_URL, $url); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); 

代替

curl_setopt($curl, CURLOPT_URL, $url . $data); 

这样我就能够消除对Content-Length头的需要,但要求仍非常缓慢。

+0

任何一个理智的服务器都会忽略你发送的任何主体(并且可能在你读取发送一个无效的HTTP请求的头文件后立即断开连接),这个头文件的内容长度为0。 'Content-Length:0'告诉服务器你完成发送报文后的消息。我最好的猜测是,服务器**相信你,当你告诉它没有更多的**。当你随后发送格式错误的头文件(你的实体主体)时,它吓坏了。如果您不遵循协议,则无法执行HTTP。 – rdlowrey

+0

此问题已得到解决。此请求不需要Content-Length标头。问题在于TTL太低的API服务器。我们将它修复在我们的主机文件中,并且请求现在具有正常的执行速度。 – oliboon

回答

0

某些服务器要求您设置内容长度,其他服务器则不需要。这主要是用来使它可以基于它的缓冲区。

您不应该添加0作为内容长度,而是要发送的数据量。如果将其设置为0,则某些服务器将拒绝加载它。

我猜测发生的是因为你将它设置为0,它会读取显然非常慢的内容字节/字节。

+0

内容长度应该只需要PUT请求,这就是为什么我认为这是奇怪的POST请求给我这个错误。我已经能够使用'content-length:0'进行PUT请求,而且速度并不慢。但是,当我更改了我的'CURLOPT_URL'并添加了'CURLOPT_POSTFIELDS'选项时,411错误得到了纠正。这似乎是问题在服务器内,因为它在不同的服务器上使用时正常工作。 – oliboon

+1

@oliboon你认为这是一个服务器问题,但实际上你必须按照标准来做。 –