c466934322
V2EX  ›  PHP

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

  •  
  •   c466934322 · May 14, 2018 · 5612 views
    This topic created in 2950 days ago, the information mentioned may be changed or developed.
    我的海报生成逻辑是:
    第一步从数据库里面获取推广用户的 id,
    第二步用 id 去微信生成二维码,并保存二维码
    第三步利用 thinkphp 的图片合成功能把背景图和二维码合成海报,
    第四步上传海报到临时素材接口
    第五步调用多客服接口发送海报+文案

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

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

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

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

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

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

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

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

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

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

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

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

    在此,再次对让你产生误解表示歉意。
    eve1yb0dy
        20
    eve1yb0dy  
       May 14, 2018
    打 log 看哪里慢...
    flyingghost
        21
    flyingghost  
       May 15, 2018
    1234 里都没看出有什么动态内容。
    那就为每个用户提前生成啊。
    moonsola
        22
    moonsola  
       May 15, 2018
    进来之前,以为是 php 合成图片慢;
    进来之后,发现楼主还没定位到具体是哪里慢
    vlrog
        23
    vlrog  
       May 15, 2018
    应该不是 PHP 的问题,很可能是获取微信二维码和调用客服接口比较费时
    simapple
        24
    simapple  
       May 15, 2018
    @tanszhe 看清楚,他要做的这些都可以异步实现。
    @c466934322 用 swoole 将这个任务拆分成异步的,然后返回 success 给微信,生成好图片上传后,用客服接口推给微信。使用 cgi 进程同步执行 只要用户集中操作就会阻塞,微信在服务器返回超时,还会执行重试,让进程更加忙碌。所以你把这个处理操作 都弄成异步的,就 ok 了
    han8gui
        25
    han8gui  
       Jun 8, 2018
    之前做过类似的功能,1s 之类就搞定了。
    没看出你的瓶颈在哪?
    Rootrl
        26
    Rootrl  
       Aug 1, 2018
    最后放在客户端生成,canvas
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1227 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 23:39 · PVG 07:39 · LAX 16:39 · JFK 19:39
    ♥ Do have faith in what you're doing.