当curl试图解析主机时,如何更改php curl超时(curl err_no 6)

当curl试图解析主机时,如何更改php curl超时(curl err_no 6),php,curl,timeout,dns,Php,Curl,Timeout,Dns,我正在对页面执行卷曲请求。我已经将“CURLOPT_TIMEOUT”(设置为6秒)和“CURLOPT_CONNECTTIMEOUT”(设置为4秒)都设置好了,而且这两个选项对于大多数URL都非常有效 但是,当网页没有响应时(并最终通过“无法解析主机”错误(错误号6)导致CURL停止)-似乎“CURLOPT_TIMEOUT”没有效果,CURL将等待,可能是不确定的,或者直到某个“其他”超时过期 对于我试图访问的URL,CURL似乎总是要花大约15秒的时间才能返回(这与'CURLOPT_TIMEOU

我正在对页面执行卷曲请求。我已经将“CURLOPT_TIMEOUT”(设置为6秒)和“CURLOPT_CONNECTTIMEOUT”(设置为4秒)都设置好了,而且这两个选项对于大多数URL都非常有效

但是,当网页没有响应时(并最终通过“无法解析主机”错误(错误号6)导致CURL停止)-似乎“CURLOPT_TIMEOUT”没有效果,CURL将等待,可能是不确定的,或者直到某个“其他”超时过期

对于我试图访问的URL,CURL似乎总是要花大约15秒的时间才能返回(这与'CURLOPT_TIMEOUT'或'CURLOPT_CONNECTTIMEOUT'无关)


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

好的,您的手上有3个超时

  • CULLOPT_超时-超时时间有多长 整个行动正在进行中
  • CURLOPT_连接超时-多长时间 cURL等待主机响应 应其要求
  • DNS查找超时- 您正在经历的是DNS 查询失败并需要一定的时间 这样做

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

    事实上,CURLOPT_CONNECTTIMEOUT包括dns查询时间。在PHP 5.4.9中测试。

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

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

    太棒了!我会看看怎么做的。谢谢!这不会特别容易,因为DNS通常是一个同步事件,它会阻止这个过程。有“ADN”()-它提供异步查找,虽然很旧,但功能强大。可能很容易在外部调用dig或nslookup并在花费太长时间时终止进程,但这会带来开销。如果可以使用pcntl_fork(),则可以启动一个新线程来执行此操作,或者使用pcntl_alarm()提前解除锁定。事实上,我已将其设置为10秒,并在发生2.5秒后解决超时。在PHP7.2中测试:对PHP7.3没有影响