[PHP] curl CURLOPT_TIMEOUT_MS 小于1秒 解决方案

简介: CURLOPT_TIMEOUT 设置cURL允许执行的最长秒数 CURLOPT_TIMEOUT_MS 设置cURL允许执行的最长毫秒数 CURLOPT_CONNECTTIMEOUT 在发起连接前等待的时间,如果设置为0,则

CURLOPT_TIMEOUT 设置cURL允许执行的最长秒数
CURLOPT_TIMEOUT_MS 设置cURL允许执行的最长毫秒数
CURLOPT_CONNECTTIMEOUT 在发起连接前等待的时间,如果设置为0,则无限等待
CURLOPT_CONNECTTIMEOUT_MS 尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待

CURLOPT_TIMEOUT_MS 在cURL 7.16.2中被加入。从PHP 5.2.3起可使用。
所以使用的时候请先查看libcurl版本 curl --version。

但是这个函数有个bug,如果时间小于1000毫秒也就是1秒的话,会立马报错,查看下面说明

  If you want cURL to timeout in less than one second, you can use CURLOPT_TIMEOUT_MS, although there is a bug/"feature"  on "Unix-like systems" that causes libcurl to timeout immediately if the value is < 1000 ms with the error "cURL Error (28): Timeout was reached".  The explanation for this behavior is:
  "If libcurl is built to use the standard system name resolver, that portion of the transfer will still use full-second resolution for timeouts with a minimum timeout allowed of one second."
  What this means to PHP developers is "You can use this function without testing it first, because you can't tell if libcurl is using the standard system name resolver (but you can be pretty sure it is)"
  The problem is that on (Li|U)nix, when libcurl uses the standard name resolver, a SIGALRM is raised during name resolution which libcurl thinks is the timeout alarm.
  The solution is to disable signals using CURLOPT_NOSIGNAL.  Here's an example script that requests itself causing a 10-second delay so you can test timeouts:

增加 curl_setopt($ch, CURLOPT_NOSIGNAL, 1) 可以解决此问题:

if (!isset($_GET['foo'])) {
    // Client
    $ch = curl_init('http://localhost/timeout.php?foo=bar');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);
    $data = curl_exec($ch);
    $curl_errno = curl_errno($ch);
    $curl_error = curl_error($ch);
    curl_close($ch);

    if ($curl_errno > 0) {
         echo "cURL Error ($curl_errno): $curl_error\n";
    } else {
         echo "Data received: $data\n";
    }
} else {
    // Server
    sleep(10);
    echo "Done.";
} 
目录
相关文章
|
4月前
|
JSON PHP 数据格式
PHP curl方法封装
PHP curl方法封装
31 0
|
1月前
|
PHP 数据格式
PHP 中的CURL 模拟表单的post提交
PHP 中的CURL 模拟表单的post提交
16 0
|
8月前
|
JSON PHP 数据格式
PHP curl方法封装
PHP curl方法封装
64 0
|
9月前
|
PHP
php函数file_get_contents无法获取到https链接内容问题使用curl的解决方案
php函数file_get_contents无法获取到https链接内容问题使用curl的解决方案
111 0
|
9月前
|
JSON API PHP
漏刻有时API接口实战开发系列(6):PHP开发API接口离不开的curl函数封装
漏刻有时API接口实战开发系列(6):PHP开发API接口离不开的curl函数封装
54 0
|
9月前
|
域名解析 网络协议 应用服务中间件
PHP CURL指定host内网通信
PHP CURL指定host内网通信
199 1
PHP CURL指定host内网通信
|
9月前
|
PHP
PHP CURL模拟百度网盘登陆
PHP CURL模拟百度网盘登陆
|
9月前
|
JSON 前端开发 PHP
PHP中使用CURL获得快递100API接口JSON数据的文件头处理方案
PHP中使用CURL获得快递100API接口JSON数据的文件头处理方案
73 0
|
10月前
|
PHP
PHP CURL中传递cookie的方法
PHP CURL中传递cookie的方法