default

简单描述微信头像下载出错与超时

  记得很久之前做微信头像下载遇到经常超时或下载不完全的问题,想了些办法也大太好解决。

  如果直接取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;
}

当前还没有任何评论

写下你最简单的想法