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

2018-05-14 16:04:30 +08:00
 c466934322
我的海报生成逻辑是:
第一步从数据库里面获取推广用户的 id,
第二步用 id 去微信生成二维码,并保存二维码
第三步利用 thinkphp 的图片合成功能把背景图和二维码合成海报,
第四步上传海报到临时素材接口
第五步调用多客服接口发送海报+文案

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

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

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

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

还有,只要你把 PHP 从 5 换成 7,就能获得最少 30%性能的提升
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
2018-05-14 20:54:54 +08:00
打 log 看哪里慢...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/454741

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX