PHP 高并发的时候 CURL 超时咋办

2018-03-27 13:12:13 +08:00
 solaro

求教。。最近项目做促销,是外卖系统 然后出现 502 错误, 因为外卖系统需要调用 qq 地图 定位获取坐标,然后再通过坐标反解析(服务端 CURL 请求 qq service )出附近地址

排查了业务方面的,没毛病,数据库该优化的都优化了,没有慢查询。 看了 nginx,有几个访问页面请求响应时间都超过 1 秒,有的高达 3 秒。(服务器是阿里云,ping 18ms )

最后确定了是由服务器端 CURL 请求导致的 php 卡了,那么问题来了: 1.qq 地图只有 20qps (准备换高德,这是后话),老报超限 2.curl 报了几次这个错误( local.ERROR: CURL:'Operation timed out after 5000 milliseconds with 0 out of -1 bytes received'),每次卡几秒,导致全站 502 了。。。

v 站大神多,求帮助

7244 次点击
所在节点    问与答
37 条回复
gouchaoer
2018-03-27 16:13:21 +08:00
首先你在 fpm 里面就不应该用 http 客户端访问第三方接口,这样导致 fpm 卡住,很快所有的 fpm worker 都满了
目前应急办法是开更多的 fpm worker,只要你内存允许,然后把 curl 的超时设置成 1s 之类的短一点的,然后换一个 pqs 更大的接口

长远上来考量的话,换语言肯定不现实,因为现在系统工作的很好就这个接口有问题,像这种需要访问第三方服务的接口你可以考虑用 swoft 或者 swoole 裸写也 ok,反正你只有一个接口,或者干脆换 go 语言,go 语言不存在阻塞问题
tanszhe
2018-03-27 16:19:38 +08:00
通过坐标获取附件的地址 这种业务 直接客户端调吧 不走服务器
solaro
2018-03-27 16:52:45 +08:00
@des 微信里的网页,打开的时候要调 qq 地图定位,然后用户点了获取当前定位坐标,然后通过 js 上报给服务器,服务器根据 qq 的 web service 去反解析坐标的地址,就是当前位置了,然后这个 qq web service 不是还有附近推荐地址吗,类似美团那种选择附近地址那样。。所以需要实时的,后端去请求 qq web service 的时候是通过 curl,之前用 file_get_contents 更垃圾
solaro
2018-03-27 16:53:29 +08:00
@collinswang 做了企业认证,从 10qps 加到 20qps,垃圾的要死,准备且高德
solaro
2018-03-27 16:55:00 +08:00
@tanszhe 因为是壳封装 web,需求要求这么做,坑其实挺多的,一个 web 同时 微信、封壳(安卓、ios )都要用,封壳说白了就是 一个壳带一个 webview,md
solaro
2018-03-27 16:55:34 +08:00
@rootx 怎么操作?求指导
orangeade
2018-03-27 16:58:45 +08:00
写一个类似 python aiohttp/tornado AsyncHttpclient 的东西
tanszhe
2018-03-27 17:12:27 +08:00
居然看见有那么多换语言的,无语。不管同步异步都是一样的。不过避免把 fpm 连接数占满你可以后台写个 php 的守护进程来单独处理这个业务这样就和其他业务分开了。更好一点的解决方案客户端提前获取用户坐标后端提前获取这个坐标的信息,这样请求可以直接返回不用调取接口了。再你可以把坐标存起来 如果发现用户的坐标和存起来的坐标距离不远就可以用已经存在的坐标信息,这样也不用调取接口了。
yogogo
2018-03-27 18:01:54 +08:00
反解析坐标地址,客户端不是就能实现了吗?
whisper219
2018-03-27 19:12:03 +08:00
解析地域信息放在客户端来做
solaro
2018-03-28 11:01:27 +08:00
@whisper219
@yogogo

两位大哥,是微信端的。公众号里点菜单打开 web 站的。。。
原声版已经再开发了,之前为了兼容壳的坑,等壳废弃了,微信端全部改直接调用微信里自带的定位
surfire91
2018-03-28 11:20:32 +08:00
1. 较低超时时间,增加 fpm 处理数量,不过治标不治本
2. 交钱或者换个 qps 更大的地图 api
solaro
2018-03-28 17:49:27 +08:00
@surfire91 那个,服务端大量 curl 咋整
surfire91
2018-03-28 19:23:35 +08:00
没懂,服务端发 curl 不是必须的吗?该请求请求呗
solaro
2018-04-16 11:33:05 +08:00
8G 内存的 6M 阿里云

解决方案:
pm=dynamic
pm.start_server = 5 之前调为 10,占用了很多无用的内存
pm.mini_servers = 5 跟 start_server 保持一致
pm.max_servers = 30 之前 为 35,后降低为 30

重启 php-fpm 进程即可

感谢大家

哦对了,所有涉及百度地图的,都替换成高德了。
solaro
2018-04-16 11:36:21 +08:00
业务拆分:curl 请求太频繁导致 php 进程卡住,一个是设置超时时间 10s,另一个是降低 curl 请求数,本质上是改业务,原本大量的 curl 去请求计算两个坐标间的距离,后面改为让前端页面载入高德、qq 地图,把坐标值写再 html 中,让前端页面去调用 js sdk 计算距离。502 再也不粗线了
solaro
2019-04-22 15:27:53 +08:00
挖坟,前几天收到了腾讯地图的微信推送消息,配额提高到比高德还高

```
现决定将免费配额大幅提升!不同接口提升的幅度不一样,比如开发者们用的最多的地址解析 /逆地址解析接口,调用量免费配额就提升到了 300 万 /日,QPS 也提升到了 1000 次;地点搜索、路线规划、关键词输入提示等常用接口的免费配额提升到了 50 万 /日,QPS 提升到了 200 次。
```

可以更友好的在微信公众号里做事了(可惜了,代码迁移成本较高)。

附图:
![微信图片_20190422152533.png]( https://i.loli.net/2019/04/22/5cbd6c9ead7e8.png)

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

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

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

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

© 2021 V2EX