记得很久之前做微信头像下载遇到经常超时或下载不完全的问题,想了些办法也大太好解决。
如果直接取CURL的header信息感觉总是有一些问题,而且参数不好判断,同时在微信头像服务器返回的header信息中发现了X-ErrNo:-106等这样的标记,就考虑将header头与内容一起获取,分割再处理。
这样就一次性解决了超时检查和错误头像检查的问题。
但问题并没有解决,依旧经常出现连接被限制,下载头像直接超时的问题,挂代理或许是一个解决办法。
实际上,这样判断头像是否成功下载是没问题了,有一个其他问题就是如果出现头像不完整,可以参考有关图片的编码规范进行检查。
/**
* 获取一张远程的图片内容
* @author huzhiyu
* @param string $url
* @param bool $error_image 告知该图片是否为错误图片,仅对微信图片返回X-ErrNo头有效
* @param string $image_type 设置图片的类型,如果成功则标记为有效
* @param array $header 成功输出的header 信息
* @param int $req_number 请求的次数
* @return array|bool|null
*/
function get_weixin_avatar($url, &$error_image = null, &$image_type = null, &$header = null, &$req_number = 0)
{
$error_image = false;
$max = 5;
do {
$req_number++;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); //获取地址
curl_setopt($ch, CURLOPT_TIMEOUT, 20);//设置10秒超时
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
$response = explode("\r\n\r\n", curl_exec($ch), 2);
$header = http_parse_headers($response[0]);//@TODO 自行实现头部解析
$response = isset($response[1]) ? $response[1] : null;
$response_length = strlen($response);
curl_close($ch);
$check = false;
if(!empty($header) && $response_length > 0) {
//两段数据不为空
if(empty($header['content-length']) && empty($header['x-errno'])) {
$check = true;//没有长度且没有错误信息,标记为正确
} else {
if(!empty($header['x-errno'])) {
$error_image = true;//设置标记为错误的图片信息
return false;
}
if(!empty($header['content-length']) && (int)$header['content-length'] == $response_length) {
$check = true;
}
}
}
} while($max-- > 0 && !$check);
if(!$check) {
return false;
}
$image_type = isset($header['content-type']) ? explode("/", $header['content-type']) : array();
if(isset($image_type[1]) && strtolower($image_type[0]) == "image") {
$image_type = strtolower($image_type[1]);
} else {
$image_type = "";
}
return $response;
}
* 获取一张远程的图片内容
* @author huzhiyu
* @param string $url
* @param bool $error_image 告知该图片是否为错误图片,仅对微信图片返回X-ErrNo头有效
* @param string $image_type 设置图片的类型,如果成功则标记为有效
* @param array $header 成功输出的header 信息
* @param int $req_number 请求的次数
* @return array|bool|null
*/
function get_weixin_avatar($url, &$error_image = null, &$image_type = null, &$header = null, &$req_number = 0)
{
$error_image = false;
$max = 5;
do {
$req_number++;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); //获取地址
curl_setopt($ch, CURLOPT_TIMEOUT, 20);//设置10秒超时
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
$response = explode("\r\n\r\n", curl_exec($ch), 2);
$header = http_parse_headers($response[0]);//@TODO 自行实现头部解析
$response = isset($response[1]) ? $response[1] : null;
$response_length = strlen($response);
curl_close($ch);
$check = false;
if(!empty($header) && $response_length > 0) {
//两段数据不为空
if(empty($header['content-length']) && empty($header['x-errno'])) {
$check = true;//没有长度且没有错误信息,标记为正确
} else {
if(!empty($header['x-errno'])) {
$error_image = true;//设置标记为错误的图片信息
return false;
}
if(!empty($header['content-length']) && (int)$header['content-length'] == $response_length) {
$check = true;
}
}
}
} while($max-- > 0 && !$check);
if(!$check) {
return false;
}
$image_type = isset($header['content-type']) ? explode("/", $header['content-type']) : array();
if(isset($image_type[1]) && strtolower($image_type[0]) == "image") {
$image_type = strtolower($image_type[1]);
} else {
$image_type = "";
}
return $response;
}
当前还没有任何评论