【问题标题】:why curl timeout when get from url?为什么从 url 获取时 curl 超时?
【发布时间】:2018-04-28 04:00:08
【问题描述】:

为什么 PHP 中的 cURL 在从网页获取 HTML 时会返回超时消息?

这里是 PHP 代码。

function getFromUrl( $url )
{
  $curl = curl_init($url);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  $result = curl_exec($curl);

  if (curl_errno($curl))
  {
    echo 'Error:' . curl_error($curl) . '<br>' ;
  }

  curl_close($curl);

  return $result ;
}

当我以 www.google.com 作为 URL 运行函数时,我得到了预期的结果。

  $url = 'http://www.google.com' ;
  $result = getFromUrl($url) ;

但是,当我在第二个网络服务器上传递网页的 URL 时,我得到一个超时响应。当我将它粘贴到浏览器中时,该 URL 存在。为什么会出现超时消息?

$url = "http://xxx.54.20.170:10080/accounting/tester/hello.html" ;
echo $url . '<br>' ;
$rv = getFromUrl( $url ) ;
echo  $rv . '<br>' ;

这里是 cURL 错误信息:

错误:无法连接到 xxx.54.20.170 端口 10080:连接超时

我希望将数据从一台网络服务器传输到另一台。

谢谢,

【问题讨论】:

  • 在终端运行curl http://xxx.54.20.170:10080/accounting/tester/hello.html的结果是什么?
  • @meysam 添加 -v,curl -v http://xxx.54.20.170:10080/accounting/tester/hello.html
  • 我从命令行运行 curl 并且它有效。返回页面的html。只有当我在共享主机站点上从 PHP 代码运行并且目标是从我办公室的路由器转发的端口时,它才会失败。我将端口 10080 转发到防火墙后面的 Web 服务器。

标签: php curl


【解决方案1】:

对于 PHP,

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); 
curl_setopt($ch, CURLOPT_TIMEOUT, 400); //timeout in seconds

首先从终端使用以下额外选项检查 curl 是否正常工作。

--连接超时 允许连接的最长时间(以秒为单位) 服务器采取。这只会限制连接阶段,一次 curl has connected 这个选项没有用了。自 7.32.0 起, 此选项接受十进制值,但实际超时将 随着指定超时的增加,准确度下降 精度差。另请参见 -m, --max-time 选项。

If this option is used several times, the last one will be used.

-m, --max-time 允许整个操作执行的最长时间(以秒为单位) 拿。这对于防止批处理作业挂起很有用- 由于网络速度慢或链接中断,需要几个小时。自从 7.32.0,此选项接受十进制值,但实际时间- 随着指定超时的增加,out 的准确性会降低 以十进制精度。另请参阅 --connect-timeout 选项。

If this option is used several times, the last one will be used.

尝试使用它们来增加超时时间。

curl 无法正常工作的原因有很多。其中一些可以是, 1)响应时间慢。 2) 很少有站点检查少数标头参数来响应请求。这些参数包括 User-Agent、Referer 等,以确保它来自有效来源而不是通过机器人。

【讨论】:

  • 感谢您。在我的例子中,我的 PHP 代码在共享主机站点上运行,阻止到端口 10080 的流量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 2020-11-27
  • 2023-03-13
  • 2018-05-15
相关资源
最近更新 更多