在php中使用CURL访问接口是很常用的操作,其中必不可少的选项是超时的设置curl_setopt($ch, opt),curl的超时设置包括连接超时和执行超时可选用以下几个选项: 
CURLOPT_CONNECTTIMEOUT    在发起连接前等待的时间,如果设置为0,则无限等待。  
CURLOPT_CONNECTTIMEOUT_MS 同上,但以毫秒为单位。
CURLOPT_TIMEOUT     设置cURL允许执行的秒数。默认为0,不限 
CURLOPT_TIMEOUT_MS  同上,但是以毫秒为单位。  此项在cURL7.16.2中被加入。从PHP 5.2.3起可使用。、

CURLOPT_DNS_CACHE_TIMEOUT 设置在内存中保存DNS信息的时间,默认为120秒。 

但尝试在PHP中如果使用CURLOPT_TIMEOUT_MS并且超时时间小于1秒时,会报错"http_error": "Timeout was reached", 如下为执行时所报的错误:

{
    "url": "url.....",
    "content_type": null,
    "http_code": 0,
    "header_size": 0,
    "request_size": 0,
    "filetime": -1,
    "ssl_verify_result": 0,
    "redirect_count": 0,
    "total_time": 0,
    "namelookup_time": 0,
    "connect_time": 0,
    "pretransfer_time": 0,
    "size_upload": 0,
    "size_download": 0,
    "speed_download": 0,
    "speed_upload": 0,
    "download_content_length": -1,
    "upload_content_length": -1,
    "starttransfer_time": 0,
    "redirect_time": 0,
    "redirect_url": "",
    "primary_ip": "",
    "certinfo": [],
    "http_error": "Timeout was reached",
    "http_errno": 28
}
从PHP手机上看,这是一个BUG,要解决这个问题,需要设置CURLOPT_NOSIGNAL选项为true,

curl_setopt ( $ch,  CURLOPT_NOSIGNAL,true);

CURLOPT_NOSIGNAL:启用时忽略所有的curl传递给php进行的信号。在SAPI多线程传输时此项被默认启用。
相关评论(0)
您是不是忘了说点什么?

友情提示:垃圾评论一律封号...

还没有评论,快来抢沙发吧!