背景概述:
我有一个脚本,里面定义了一个方法,方法里面是一个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”》
作者寒冰遇到这个问题的是,也没有精力从底层分析问题所在。鸟哥的文章从底层分析了原因。大家注意就是了。