使用 PHP 生成微信海报速度过慢 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
c466934322
V2EX    PHP

使用 PHP 生成微信海报速度过慢

  •  
  •   c466934322 2018-05-14 16:04:30 +08:00 5239 次点击
    这是一个创建于 2762 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我的海报生成逻辑是:
    第一步从数据库里面获取推广用户的 id,
    第二步用 id 去微信生成二维码,并保存二维码
    第三步利用 thinkphp 的图片合成功能把背景图和二维码合成海报,
    第四步上传海报到临时素材接口
    第五步调用多客服接口发送海报+文案

    服务器配置是:
    php5.6+mysql5.7
    单体架构
    内存占用为 37%,
    cpu 在获取海报的时候为 35%

    但是出现的问题是:
    用户在公众号输入关键字获取海报的时候,反应速度超级慢,有时候差不多过了 4s 甚至 5s 才回复出来文案+海报

    怎么让反应速度快些
    26 条回复    2018-08-01 01:01:32 +08:00
    FYK
        1
    FYK  
       2018-05-14 16:12:43 +08:00
    ...所以我从你的描述中没有明确感受到是 php 成为了瓶颈。
    widdy
        2
    widdy  
       2018-05-14 16:12:49 +08:00
    先使用回复接口回复个稍等,然后使用客服接口发海报回去!
    c466934322
        3
    c466934322  
    OP
       2018-05-14 16:21:11 +08:00
    @FYK 我标题的意思是说我用了 php 这个语言的技术,并不是说 php 成为了瓶颈,不要断章取义。我写 php 的目的是希望对 php 感兴趣的人才帮忙解答一下。
    1010011010
        4
    1010011010  
       2018-05-14 16:23:27 +08:00
    我记得 gd 库某些功能很慢

    可能是处理图片占大头
    lookwi
        5
    lookwi  
       2018-05-14 16:24:24 +08:00 via iPhone
    换图片处理 imagick
    DonaidTrump
        6
    DonaidTrump  
       2018-05-14 16:24:47 +08:00 via iPhone
    上 php7.2 啊
    c466934322
        7
    c466934322  
    OP
       2018-05-14 16:26:36 +08:00
    @FYK 我这种渣渣水平真的不敢说那个语言有瓶颈,只能说我还在努力想说这句话中。谢谢
    ibaoka
        8
    ibaoka  
       2018-05-14 16:30:29 +08:00
    速度慢的瓶颈也许是在获取微信头像上,不要用 file_get_content,用 curl,会有惊喜。
    zhouxuchen
        9
    zhouxuchen  
       2018-05-14 16:30:39 +08:00
    一个曲线救国的方案,如果背景图是固定的,可以用第三方对象存储的水印接口完成。这样只要生成二维码后上传到 CDN,把带着打水印参数的背景图地址直接返回给前端就行了。
    KIDJourney
        10
    KIDJourney  
       2018-05-14 16:30:42 +08:00
    说了这么多你还是不知道慢在哪,多打点 metrics。看一下瓶颈在哪。
    kslr
        11
    kslr  
       2018-05-14 16:35:35 +08:00
    拼图还是要自己写,我之前做过和你的业务一样,基本卡在拼图。
    kslr
        12
    kslr  
       2018-05-14 16:36:24 +08:00
    不过,如果你只有一张拼图的话,还是打点吧 不可能这么慢的,网络 IOCPU 看看是哪一个。
    simapple
        13
    simapple  
       2018-05-14 16:38:34 +08:00
    异步操作了吗?
    learnshare
        14
    learnshare  
       2018-05-14 16:43:54 +08:00 via Android
    之前做的方案是写成页面,用 headless 浏览器截图,这样生成的图像更加细致可控
    h1367500190
        15
    h1367500190  
       2018-05-14 17:01:37 +08:00
    是实话到底是哪一步慢啊,看得我急死了
    tanszhe
        16
    tanszhe  
       2018-05-14 17:12:23 +08:00
    @1010011010 @lookwi @tulongtou 明显是网络耗时导致的,其中 1,2,4 步都会网络请求
    @simapple 看清楚,每一步都是依赖上一步的 异步解决不了。
    w516322644
        17
    w516322644  
       2018-05-14 17:57:14 +08:00
    这个查下慢的原因在哪,
    我查过是用 file_get_contents 获得微信图片很慢,用 curl 获得就很快。
    dilu
        18
    dilu  
       2018-05-14 18:09:17 +08:00
    先分析 MySQL 慢查询日志,看看是不是数据库出现了瓶颈,在看 PHP-FPM 的慢日志,看是不是脚本出了问题,最后看 Nginx 日志,再判断是不是网络延迟的问题,总要先确定问题出在哪才能动手去解决

    还有,只要你把 PHP 从 5 换成 7,就能获得最少 30%性能的提升
    FYK
        19
    FYK  
       2018-05-14 20:38:19 +08:00
    @c466934322 不好意思,可能让你产生了误会。我的本意是同:
    #10
    #15
    #17
    #18
    他们的说法。

    你遇到了这个问题,但是完全没有相应有用的错误提示之类的信息。我说的错误提示,如 #18 所述类似,你是否自己对这相关对方面进行了分析了?如果有更多的信息,可以帮助大家更有方向性地对你对这个问题进行分析。

    除了以上的解释,我说明一下我为什么会留下这个评论 :「...所以我从你的描述中没有明确感受到是 php 成为了瓶颈。」:

    你的标题是 「使用 PHP 生成微信海报速度过慢」。那当我看到标题的时候,我觉得是和 PHP 强相关的,是由 PHP 导致的。当我进来的时候,我潜意识的应该是觉得可能会获得这样的信息:「你通过别的语言或者其他什么方式进行了这种操作都没有问题,但是现在由于某种原因,你要用 PHP,而 PHP 得到的结果并不理想」。实际我看到的是:
    1. 你描述了一下你的程序逻辑
    2. 配上了服务器的配置
    3. 最后提出了具体的问题。
    我个人感觉从你的帖子内容中,感受到的是和 PHP 没有那么强相关的。就你的内容而言,网络,数据库或其他方面都可能产生问题。而你并没有说你定位到问题是在哪里,另外我认为从你的描述中,也可能存在问题并不出在 PHP 的情况。

    我觉得以上对你在 #3 的回复是有足够程度的解释的。

    另外,对你 #7 的回复 「我这种渣渣水平真的不敢说那个语言有瓶颈,只能说我还在努力想说这句话中。谢谢」。

    对该回复,我理解为「你觉得你的 PHP 水平没有达到你自觉可以满意的某种程度」,嗯,我也这么评价自己。「不敢说那个语言有瓶颈」,这个吧,我觉得每种语言都不是万能,都有擅长做的方面,以及可以做但是不擅长的方面,「敢不敢说」就是你对该种语言对认知程度,比如即使我对某种语言没有深入学习,但是我有了解过它的擅长和不擅长的地方,那么在评论像你这个帖子的这种情况的时候,我觉得我是可以说 「这种语言在某些方面有局限性,而在这种局限下进行开发,这种语言可能就会成为程序的瓶颈」。

    希望你不嫌弃我这冗长的回复。

    在此,再次对让你产生误解表示歉意。
    eve1yb0dy
        20
    eve1yb0dy  
       2018-05-14 20:54:54 +08:00
    打 log 看哪里慢...
    flyingghost
        21
    flyingghost  
       2018-05-15 11:20:18 +08:00
    1234 里都没看出有什么动态内容。
    那就为每个用户提前生成啊。
    moonsola
        22
    moonsola  
       2018-05-15 11:28:07 +08:00
    进来之前,以为是 php 合成图片慢;
    进来之后,发现楼主还没定位到具体是哪里慢
    vlrog
        23
    vlrog  
       2018-05-15 13:49:46 +08:00
    应该不是 PHP 的问题,很可能是获取微信二维码和调用客服接口比较费时
    simapple
        24
    simapple  
       2018-05-15 14:38:00 +08:00
    @tanszhe 看清楚,他要做的这些都可以异步实现。
    @c466934322 用 swoole 将这个任务拆分成异步的,然后返回 success 给微信,生成好图片上传后,用客服接口推给微信。使用 cgi 进程同步执行 只要用户集中操作就会阻塞,微信在服务器返回超时,还会执行重试,让进程更加忙碌。所以你把这个处理操作 都弄成异步的,就 ok 了
    han8gui
        25
    han8gui  
       2018-06-08 17:29:54 +08:00
    之前做过类似的功能,1s 之类就搞定了。
    没看出你的瓶颈在哪?
    Rootrl
        26
    Rootrl  
       2018-08-01 01:01:32 +08:00
    最后放在客户端生成,canvas
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1075 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 18:09 PVG 02:09 LAX 10:09 JFK 13:09
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86