V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
c466934322
V2EX  ›  PHP

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

  •  
  •   c466934322 · 2018-05-14 16:04:30 +08:00 · 4679 次点击
    这是一个创建于 2376 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我的海报生成逻辑是:
    第一步从数据库里面获取推广用户的 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
    tulongtou
        6
    tulongtou  
       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   ·   实用小工具   ·   5243 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 05:45 · PVG 13:45 · LAX 21:45 · JFK 00:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.