Intervention Image 处理 https 图片路径问题

在Laravel上使用Intervention\Image扩展, 处理 https 路径的图片地址,其中遇到的各种问题

image description

Intervention\Image 处理 https 图片路径问题

此问题是前一段时间出现的,公司的图片服务器因为需要升级到HTTPS,因此Intervention\Image处理不了图片服务器上的图片了,在网上也搜了不少,不过没发现类似的问题,最后在Laravel China上发布了个问题贴,原贴,关于线上环境用 Intervention\Image 处理 https 图片路径报错问题?,此文对此问题做个整理记录。

具体的问题此处就不做过多说明,有需要的可以查看上面的地址

  • 首先先查看出现此问题的原因,经过查找后,发现问题主要是出在PHP的file_get_contents()函数上,此函数获取不了https路径的链接对应的内容。具体可以查看Intervention\Image的源码内容,位置:vendor\intervention\image\src\Intervention\Image\AbstractDecoder.php,涉及到的方法为:方法

  • OK,知道了具体原因就方便了,下面是我用PHP的curl写的一个获取链接内容的方法:


    /**
     * 获得URL对应页面的内容
     * @param  [type] $url [description]
     * @return [type]      [description]
     */
    function get_url_content($url){
        if(function_exists("curl_init")){
            $ch = curl_init();
            $timeout = 3600;
            if (1 == strpos("$".$url, "https://")){
              curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
              curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);  // 从证书中检查SSL加密算法是否存在
            }
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
            $str = curl_exec($ch);
            curl_close($ch);
        }else{
            if(ini_get('allow_url_fopen')){$str = file_get_contents($url);}
        }
        return $str;
    }
  • 然后将新的方法替换掉上图中initFromUrl方法中的file_get_contents方法(里面的参数可能需要做一定的修改)。替换完成后,此时再使用Intervention\Image时,即可一切正常。
END