当前位置:首页 > 网站运营杂谈 > 正文

curl_exec执行超时怎么办?(设置timeout参数快速解决)

curl_exec执行超时怎么办?(设置timeout参数快速解决)

最近这一阵子,我忙活一个新项目,主要就是做数据同步,需要对接一个外部的API接口来拉取内容。这个接口时快时慢,有时候响应非常及时,但更多时候是磨磨蹭蹭,慢得要死。 刚开...

最近这一阵子,我忙活一个新项目,主要就是做数据同步,需要对接一个外部的API接口来拉取内容。这个接口时快时慢,有时候响应非常及时,但更多时候是磨磨蹭蹭,慢得要死。

刚开始上线跑,直接就傻眼了。每次调用那个接口,程序就卡那儿,跟死了一样,一分钟两分钟都过去了,一点动静都没有。我们这边前端页面也就跟着一直转圈圈,用户投诉电话都快打爆了。我整个人都快崩溃了。

我排查自己的代码时遭遇的痛苦

我的第一反应是:肯定是我的代码烂了。于是赶紧翻来覆去地查,一行一行地看,愣是找不出自己代码逻辑上的毛病。后来才猛地一拍大腿,不对,这卡住肯定是在等那个外部接口返回,就是`curl_exec`这里给我在拖后腿!

我知道这个`curl`默认是很耐心的,它能等很久。但业务哪能等得起?用户哪有那耐心?我赶紧去翻以前的记录,扒以前的笔记,就想起以前好像见过设置超时时间的参数。果然找到了!

我抄起来就加到我的`curl_setopt_array`里面,用起来也特别简单:

curl_exec执行超时怎么办?(设置timeout参数快速解决)
  • CURLOPT_TIMEOUT:这个管总时长,就是从头到尾,允许`curl`执行的最长时间。我直接给它扔了个5秒。
  • CURLOPT_CONNECTTIMEOUT:这个管连接的,允许连接到服务器的最长时间。我设了个2秒。

这下心里就有底了。跑起来一看, 果然!一旦超过5秒,程序立马就给我报错失败了,再也不会出现那种程序假死,占用资源不释放的恶心事了。

我因为超时而引发的一场“大灾难”

说到这个超时,我就想起以前刚出来单干那会儿,给一个做电商的客户做支付网关,就是没设这个参数。结果有一次,上游银行接口抽风,响应慢了十多秒。

我的程序就在那儿硬等,后面排队的订单全堵住了。我当时都不知道是怎么回事,就看着服务器CPU直接被那堆挂起的进程给顶满了,差点儿没把我的那台破服务器给干趴下。客户凌晨两点给我打电话,吼得我耳朵都快聋了。我硬是在电脑前面,顶着两个熊猫眼,一点一点把堵塞的进程给杀光。当时头发抓得都快掉光了。

curl_exec执行超时怎么办?(设置timeout参数快速解决)

我现在想起来,要是当时我懂这个简单的超时设置,直接让它等个5秒就快速失败掉,用户最多刷新一下页面,重新下单,也不至于整个系统都跟着一起完蛋。那次真的是让我学乖了。

所以,这回我吸取教训。新项目一遇到类似问题,马上把这两个参数给安排上。实践告诉我,程序宁可快速失败,也别在那儿傻等! 给大家分享出来,希望能帮到跟我有一样烦恼的老哥们!

最新文章