php程序如何保证3秒作出响应,tcp会偶尔3秒timeout的分析以及如何用php规避这个问题...

0818b9ca8b590ca3270a3433284dd417.png

最近发现很多通过php的curl调用一个的服务会出现偶尔的connect_time超时, 表现为get_curlinfo的connect_time在3秒左右, 本来没怎么注意, 因为客户端的curl_timeout设置的就是3秒, 某天, 我把这个timeout改到了5秒后, 发现了一个奇怪的现象, 很多慢请求依旧表现为connect_time在3秒左右..看来这个3秒并不是因为客户端设置的timeout引起的.于是开始查找这个原因.

首先, 调整了linux内核关于tcp的几个参数

net.core.netdev_max_backlog=862144net.core.somaxconn=262144

可是依旧会有3秒超时, 而且数量并没有减少.

第二步, 排除是大并发导致的问题, 在一台空闲机器上也部署同样的服务, 仅让线上一台机器跑空闲机器的服务, 结果发现依旧会有报错.排除并发导致的问题.

最后, 通过查了大量的资料才发现并不是我们才遇到过这个问题, 而且这个问题并不是curl的问题, 它影响到所有tcp的调用, 网上各种说法, 但结论都指向linux内核对于tcp的实现.(某些版本会出现这些问题), 有兴趣的可以看下下面这两个资料.

一看深入到linux内核..这么高深的东西,咱这种土鳖耗不起啊..于是乎, 发挥我们手中的php来规避这个问题的时间到了.

原本的代码, 简单实现:

functioncurl_call($p1,$p2...){$ch=curl_init();curl_setopt($ch,CURLOPT_TIMEOUT,5);curl_setopt($ch,CURLOPT_URL,'http://demon.at');$res=curl_exec($ch);if(false===$res){//失败..抛异常..}return$res;}

可以看出, 如果用上面的代码, 无法避免3秒connect_time的问题..所以,下面的代码就诞生了:

functioncurl_call($p1,$p2,$times=1){$ch=curl_init();curl_setopt($ch,CURLOPT_TIMEOUT,5);curl_setopt($ch,CURLOPT_URL,'http://demon.at');$curl_version=curl_version();if($curl_version['version_number']大于等于462850){curl_setopt($ch,CURLOPT_CONNECTTIMEOUT_MS,20);curl_setopt($ch,CURLOPT_NOSIGNAL,1);}else{thrownewException('this curl version is too low, version_num : '.$curl_version['version']);

}$res=curl_exec($ch);curl_close($ch);if(false===$res){if(curl_errno($ch)==CURLE_OPERATION_TIMEOUTEDand$times!=最大重试阀值){$times+=1;returncurl_call($p1,$p2,$times);}}return$res;}

上面这段代码只是一个规避的简单实例, 一些小细节并没有可以完善..比如抛出异常以后curl资源的手动释放等等..这里不做讨论..

注意到上面几个值的含义:

462850 //因为php的CURLOPT_CONNECTTIMEOUT_MS需要 curl_version 7.16.2,这个值就是这个版本的数字版本号.还需要注意的是, php版本要大于5.2.3

20 //连接超时的时间, 单位:ms

这样这个问题就这样通过php的代码来规避开了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值