解决关于php生成带微信头像的海报速度慢卡死的问题
笔者写了一个二维码海报的功能,就是生成一个推广二维码,中间加上对应的用户微信头像,稳定运行了多年,今天不知怎么的莫名其妙就不行了
经过多次调试,最后确认是微信服务器出问题或是更改了设置,导致我代码中部分函数卡死,真是个坑,先看原代码:
// 二维码中间加入头像
$headurl = str_replace('http://', 'https://', $weixin['headimgurl']);
$headinfo = @getimagesize($headurl);
if ($headinfo) {
$headtype = image_type_to_extension($headinfo[2], false);
$headfun = 'imagecreatefrom' . $headtype;
$tmpimage = $headfun($headurl);
// 裁切头像大小
$wid = $headinfo[0];
$hei = $headinfo[1];
$newwid = $newhei = $headwidth;
if ($wid > $hei) {
$wid = $newwid;
$hei = $newwid / ($wid / $hei);
} else {
$wid = $newhei * ($wid / $hei);
$hei = $newhei;
}
// 省略其他代码
// ...
}上面的getimagesize()函数,如果传入的是微信头像地址(就是https://thirdwx.qlogo.cn/mmopen/vi_32/...之类的),运行下来需要30多秒,真是他喵的见了鬼。同样卡死的还有imagecreatefromjpeg()函数,千万不要直接传入微信头像的url地址。

解决方法:
封装一个函数,用curl来获取图片数据流,再使用getimagesizefromstring()以及imagecreatefromstring()来代替上面两个函数
新增函数:
// 用于代理获取微信头像的获取数据流,不然直接使用getimagesize或getimagesizefromstring都会很慢导致程序超时
function get_image_data($url)
{
$opts = array(
CURLOPT_TIMEOUT => 3,
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => false,
CURLOPT_HTTPHEADER => array(),
);
$ch = curl_init();
curl_setopt_array($ch, $opts);
$data = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if ($error) {
return false;
}
return $data;
}上面的代码修改后如下:
// 二维码中间加入头像
$headurl = str_replace('http://', 'https://', $weixin['headimgurl']);
$headdata = get_image_data($headurl); // 通过本地curl代理,获取图像数据流(不可以用直接用getimagesize直接获取微信头像的url,慢的要死)
$headinfo = @getimagesizefromstring($headdata);
if ($headinfo) {
$tmpimage = imagecreatefromstring($headdata); // 在内存中创建临时的头像数据
// 裁切头像大小
$wid = $headinfo[0];
$hei = $headinfo[1];
$newwid = $newhei = $headwidth;
if ($wid > $hei) {
$wid = $newwid;
$hei = $newwid / ($wid / $hei);
} else {
$wid = $newhei * ($wid / $hei);
$hei = $newhei;
}
// ...
}最终,问题解决,海报生成下来只需要500多ms
