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指针知识点收集