背景概述:
我有一個腳本,裡面定義了一個方法,方法裡面是一個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”》
作者寒冰遇到這個問題的是,也沒有精力從底層分析問題所在。鳥哥的文章從底層分析了原因。大家注意就是了。