天天看點

php curl 請求失敗,PHP CURL庫之GET、POST資料大小限制導緻請求失敗解決方案

背景概述:

我有一個腳本,裡面定義了一個方法,方法裡面是一個CURL

GET的封裝。在使用過程中一起正常。突然發現有一天一直報失敗警報。于是,我去檢視代碼,發現沒有任何問題。最後通過百度,發現這個PHP的CURL庫并預設情況下,當發送的資料超過1024位元組的時候,不會傳回響應的内容。這就是問題的所在。

封裝的CURL GET函數如下:

function sendRequestGame($url)

{

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_TIMEOUT, 10);

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);

$retData = curl_exec( $ch );

curl_close( $ch );

return $retData;

}

我相信這段代碼極少有人會看出來問題。因為,你測試此函數請求一個URL,是能正常收到傳回的。但是,假如這個URL的長度超過了1024個位元組長度。試想一下?還會正常傳回麼?答案是否定的。因為,PHP

CURL庫預設1024位元組的長度不等待資料的傳回。隻要将以上函數修改為如下即可解決這此問題。

function sendRequestGame($url)

{

$header = array('Expect:');

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_TIMEOUT, 10);

curl_setopt($ch, CURLOPT_HTTPHEADER, $header);

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);

$retData = curl_exec( $ch );

curl_close( $ch );

return $retData;

}

嗯。現在這個函數,我增加了一個Header。但是,注意,這個Header不能與以下Header一起使用:

'Content-Type:text/html;charset=UTF-8'

否則,依然會接收不到響應的資料。更深層次的原因我也沒有去深入研究。

這個問題是在4399工作時與遊戲工作室對接API時遇到的問題。這個問題估計與鳥哥提到的CURL BUG一樣:《Curl的毫秒逾時的一個”Bug”》

作者寒冰遇到這個問題的是,也沒有精力從底層分析問題所在。鳥哥的文章從底層分析了原因。大家注意就是了。