Curl的毫秒超时的一个”Bug”
来源:互联网 发布:java 字符串替换 编辑:程序博客网 时间:2024/06/06 12:56
- 本文地址:
http://www.laruence.com/2014/01/21/2939.html - 转载请注明出处
最近我们的服务在升级php使用的libcurl, 期望新版本的libcurl支持毫秒级的超时, 从而可以更加精细的控制后端的接口超时,从而提高整体响应时间.
但是, 我们却发现, 在我们的CentOS服务器上, 当你设置了小于1000ms的超时以后, curl不会发起任何请求,而直接返回超时错误(Timeout reached 28).
原来, 这里面有一个坑, CURL默认的, 在Linux系统上, 如果使用了系统标准的DNS解析,则会使用SIGALARM来提供控制域名解析超时的功能, 但是SIGALARM不支持小于1s的超时, 于是在libcurl7.28.1的代码中(注意中文注释行):
- int Curl_resolv_timeout(structconnectdata *conn,
-
constchar *hostname, -
intport, -
structCurl_dns_entry **entry, -
longtimeoutms) - {
- .......
- .......
- #ifdef USE_ALARM_TIMEOUT
-
if(data->set.no_signal) -
-
timeout= 0; -
else -
timeout= timeoutms; -
-
if(!timeout) -
-
returnCurl_resolv(conn,hostname,port,entry); -
-
if(timeout<</SPAN> 1000)//如果小于1000, 直接超时返回 -
-
returnCURLRESOLV_TIMEDOUT; -
-
.... -
....
可见, 当你的超时时间小于1000ms的时候, name解析会直接返回CURLRESOLV_TIMEOUT,最后会导致CURLE_OPERATION_TIMEDOUT, 然后就Error, Timeout reached了…
这….太坑爹了吧? 难道说, 我们就不能使用毫秒超时么? 那你提供这功能干啥?
还是看代码, 还是刚才那段代码, 注意这个(中文注释行):
- #ifdef USE_ALARM_TIMEOUT
-
if(data->set.no_signal)//注意这行 -
-
timeout= 0; -
else -
timeout= timeoutms; -
-
if(!timeout) -
-
returnCurl_resolv(conn,hostname,port,entry); -
-
if(timeout<</SPAN> 1000) -
-
returnCURLRESOLV_TIMEDOUT;
看起来, 只要set.no_signal 这个东西为1, 就可以绕过了… 那这个玩意是啥呢?
这就简单了, grep一下代码, 发现:
-
-
caseCURLOPT_NOSIGNAL: -
-
data->set.no_signal= (0!= va_arg(param,long))?TRUE:FALSE; -
break;
哈哈, 原来是这货:
0 0
- Curl的毫秒超时的一个”Bug”
- PHPCurl的毫秒超时的一个”Bug”
- 毫秒级的Curl
- curl的超时时间
- curl的超时时间设置
- curl的超时时间设置
- curl的超时时间设置
- curl连接超时的问题
- curl的超时时间设置
- curl的超时时间设置
- php的curl超时参数
- ASIHttpRequest的一个Bug与30秒超时
- ASIHttpRequest的一个Bug与30秒超时
- WinSock中关于阻塞接收/发送超时的一个BUG
- WinSock中关于阻塞接收/发送超时的一个BUG
- ASIHttpRequest的一个Bug与30秒超时
- 一个获取毫秒的函数
- php ftp和curl遇到的bug
- php 实现同一个账号同时只能…
- shell中的多进程【并发】转
- MySQL带参数的存储过程小例子
- hdfs datanode 启动失败
- cURL超时设置
- Curl的毫秒超时的一个”Bug”
- Linux实现端口转发
- PHP5.5四种序列化性能对比
- msgpack---序列化
- set_error_handler() 重要用法
- PHP中default_socket_timeout配置…
- PHP register_shutdown_funct…
- 定时器加回调监听
- php中的单例模式和工厂模式