博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[PHP] curl CURLOPT_TIMEOUT_MS 小于1秒 解决方案
阅读量:5947 次
发布时间:2019-06-19

本文共 1930 字,大约阅读时间需要 6 分钟。

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.";}

转载地址:http://dldxx.baihongyu.com/

你可能感兴趣的文章
用户故事 | 刷算法面试题的4种思考方式
查看>>
Visual Studio 2017 15.9 Previews扩展C++调试功能
查看>>
宜人贷CTO段念:透明与面向目标是管理理念的核心
查看>>
理解HTTPS
查看>>
linux环境下apache配置虚拟站点
查看>>
ACM — 辗转相除法(Euclidean algorithm)求最大公因数(GCD)
查看>>
实例讲解async的generator实现
查看>>
Friday Q&A 2016-02-19: 什么是安全区域?
查看>>
vertx的一些问题
查看>>
将json字符串转化为json对象(需要引入json2.js框架)[转]
查看>>
python常用的包
查看>>
[译] 学习如何构建自动化、跨浏览器的 JavaScript 单元测试
查看>>
根治JavaScript中的this-ECMAScript规范解读
查看>>
协议与代理之间的阐述
查看>>
Kubernetes 1.2.0 发布,Docker集群管理驶入快车道
查看>>
在CentOS下,利用FFMPEG对视频进行转码
查看>>
SublimeText3系列(3)- HTML-CSS-JS Prettify美化代码&Markdown Preview写作
查看>>
理解 Redux
查看>>
填一填用了半个月 ionic 遇到的坑
查看>>
[译] 用 Haskell 写简单的 Monadic Parser
查看>>