解决关于php生成带微信头像的海报速度慢卡死的问题

oy2年前 (2024-10-23)技术研究4161

笔者写了一个二维码海报的功能,就是生成一个推广二维码,中间加上对应的用户微信头像,稳定运行了多年,今天不知怎么的莫名其妙就不行了

经过多次调试,最后确认是微信服务器出问题或是更改了设置,导致我代码中部分函数卡死,真是个坑,先看原代码:


// 二维码中间加入头像
$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地址。


微信截图_20241023195309.png




解决方法:

封装一个函数,用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


微信截图_20241023200912.jpg

相关文章

禁止ADSL路由器上网的破解方法

部分ISP禁止多用户共享上网,甚至有些还出台了举报其他用户接路由器共享上网给予奖励的措施,笔者这边就曾发生过这样的事情。其实共享上网是常有的事情,几台电脑通过路由器,或者ADSL宽带路由共享上网,可以…

关于禁止局域网中PPS等网络电视

关于禁止局域网中PPS等网络电视

 总所周知,像PPS UUsee等这样的网络电视依靠p2p原理工作,我们在使用此类软件观看电视的同时,也同时为他人进行上传,从而占用大量宝贵的上行带宽,导致整个局域网中网速极慢,严重影响他人…

QQ、360冲突解决方案 临时兼容方案

本不想发表此文,主要还是由于部分用户对360依依不舍,或是短时间内不知用何杀毒软件替换,因此提供一个临时兼容方法。腾讯已于早些时候发布公告称强制不兼容360,非常强硬的表明了立场与360势不两立,用户…

揭开无线网络经常掉线之谜

揭开无线网络经常掉线之谜

使用无线网络的朋友们,哪类无线故障问题最让你心烦呢?掉线、断网、还是掉线、断网。没错,相信这个故障刺痛过每个无线用户的心......。那么当掉线、断网又一次出现在你面前的时候,你有好的解决办法来应对吗…

QQ2012最新版本号(持续更新)

由于2007以前的老版本QQ已被腾讯限制登录,故只发出还能正常使用的QQ版本号。推荐收藏本页,有新的版本号时我会及时更新本页。提示:如果你用的是QQext插件,则将下列内容直接替换QQext目录下的v…

12个网站主页必备关键元素

12个网站主页必备关键元素

Hubspot绝对是在将驱动内容进入营销策略方面做得最绝的一家,我从没见过一家公司能够推出这么多白皮书、演示以及电子书籍。现在Hubspot又推出了关于网站首页12大元素的信息图表。 1主标题:3秒…

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。