curl是什么
curl 模拟浏览器请求,可以获取内容,支持浏览器类型,cookie和ip等。curl性能上也比file_get_contents高,所以一般获取api都用curl方式。
curl在使用过程发现的问题
首先,curl是网络访问,php不同项目通信时候使用curl来调用http,非常消耗性能。
例子1:前端有多个获取用户id的api,如果用户存在就直接返回用户id,不存在就用curl的方式调用一个单进程顺序处理注册用户写入数据库的http协议的api。
问题来了:测试如果把创建用户当如前端的api中处理,100并发,10000人次 qps有300左右,出现的问题就是数据库有重复数据,然后把创建用户的功能抽取使用单进程模式顺序插入,前端api用curl的方式调用,100并发,10000人次 qps只有15左右。性能以数量级下降,需要解决。
解决办法:把创建用户的http服务改成tcp协议的服务。前端api使用socket连接tcp。测试 100并发,10000人次 qps300左右。性能恢复。问题解决。
思考:php调用curl非常消耗性能,如果内部服务通信建议使用tcp的方式。(curl为什么这么消耗性能暂时没有找到具体原因,待查)
例子2:我们需要用curl来请求第三方的api,测试发现2000次访问有20几次失败。
思考:由于第三方是跨地域的,延迟有200ms左右,有一定的丢包率,这种网络情况是没法避免的,还有本身我需要带证书访问https的一个api,这也有一定的连接失败的可能。那么我们解决这中网络问题首先要测试失败率千分之5以下公司能接受。那么我之前的测试失败率达到了百分之1以上了肯定不能接受,那么一定需要加上重连机制。
继续测试:加上重连机制(一次重连)测试6000次,一次成功5970几次 重连成功30几次,失败0次。几次测试下来结果差不多,失败都是0次。
那么,问题解决。
再次在内网环境下测试,发现万次都没有失败的情况出现。
再次思考:在跨机房跨地域的网络访问是有一定几率出现问题的。所以在涉及此类型问题时,一定要测试失败率,如果是自己的服务,尽量放在相同局域网内(很关键)。
上一页 web高并发的理解和发现(二)
下一页 C指针知识点收集