【问题标题】:How can I change the php curl timeout when curl attempts to resolve host (curl err_no 6)curl尝试解析主机时如何更改php curl超时(curl err_no 6)
【发布时间】:2011-05-12 16:16:48
【问题描述】:

我正在对页面执行 curl 请求。我已经设置了 'CURLOPT_TIMEOUT'(到 6 秒)和 'CURLOPT_CONNECTTIMEOUT'(到 4 秒) - 两者都适用于大多数 URL。

但是,当网页没有响应(并最终导致 CURL 通过“无法解析主机”错误(err_no 6))时 - 似乎“CURLOPT_TIMEOUT”没有效果,curl 将等待,可能无限期或直到一些“其他”超时到期。

对于我尝试访问的 URL,CURL 似乎总是需要 15 秒才能返回(这与“CURLOPT_TIMEOUT”或“CURLOPT_CONNECTTIMEOUT”无关。

谁能告诉我如何限制 CURL 尝试解析主机所花费的时间?

【问题讨论】:

    标签: php curl timeout dns


    【解决方案1】:

    嗯,你手上有 3 次超时。

    1. CURLOPT_TIMEOUT - 多长时间 整个操作正在进行
    2. CURLOPT_CONNECTTIMEOUT - 多长时间 cURL 等待主机响应 应其要求
    3. DNS 查找超时 - 你正在经历什么,DNS 查询失败并需要一定时间 这样做

    PHP 中的 cURL 没有设置此超时的默认方法,我建议使用另一种超时方法解析主机名,然后将 IP 传递给 cURL。

    【讨论】:

    • 太棒了!我会看看如何做任何尝试,谢谢!
    • 这不会特别容易,因为 DNS 通常是一个同步事务,它会阻塞进程。有 'adns' (chiark.greenend.org.uk/~ian/adns) - 它提供异步查找,它很旧但很实用。可能很容易在外部调用 dig 或 nslookup 并在花费太长时间时终止进程,但这会带来开销。如果你可以使用 pcntl_fork(),那么你可以启动一个新线程来执行此操作,或者使用 pcntl_alarm() 提前退出锁定。
    【解决方案2】:

    在使用 cURL 之前更改 dns 解析超时

    putenv('RES_OPTIONS=retrans:1 retry:1 timeout:1 attempts:1');
    

    【讨论】:

    • 测试:对php 7.3没有影响
    【解决方案3】:

    实际上,CURLOPT_CONNECTTIMEOUT 包含了 dns 查询时间。在 php 5.4.9 中测试。

    【讨论】:

    • 事实上,我将它设置为 10 秒,并在 2.5 秒后解决超时。在 php 7.2 中测试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多