【问题标题】:Why does PHP's cURL appear to 'timeout' on certain URLs?为什么 PHP 的 cURL 在某些 URL 上似乎“超时”?
【发布时间】:2018-02-15 20:03:47
【问题描述】:

我正在使用 PHP 的 cURL 从各种 URL 中获取一些标签信息。我的请求有时会起作用,但有时它们根本不起作用。我的代码不起作用有什么原因吗? (请注意,我也在使用 simple_html_dom):

$webpage = 'http://www.some_url.com';

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, $webpage);  
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($curl, CURLOPT_FAILONERROR, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_FRESH_CONNECT, true);

$str = curl_exec($curl);  
curl_close($curl);  

$html = '';

if( !empty($str) )
{
    require_once( 'simple_html_dom.php');

    $html= str_get_html($str);
    $element = $html->find('h1', 0);
    $webpage_name = strip_tags($element);

    $item = $html->find('meta[name=description]', 0);
    $description =  $item->content;
}

// save $description to database
// save $webpage_name to database

对于我尝试的大约一半的 URL,描述和网页名称存储在我的数据库中,但对于另一半,它们没有存储,并且脚本只是停滞不前。也就是说,当用户向我的网站提交 URL 时,会在 URL 上传到我的网站时显示进度条。然后,进度条消失,并且 URL 显示在我的网页上,供用户在 URL 提交完成后查看。对于麻烦的 URL,进度条会消失,但链接不会出现在页面上,并且没有任何内容存储到我的数据库中。我错过了什么?

【问题讨论】:

  • 你对运行这个脚本的机器有shell访问权限吗?尝试远程登录到这些“坏”网址的 80 端口,看看是否也超时。如果是这样,那么它不是 curl - 某处有防火墙阻止了命中。
  • 可能是服务器端或网络问题。有时网速很慢...
  • 另外一点信息。有时,但并非总是如此,我可以让一些“坏 url”在我的 MAMP 开发服务器上工作,但不能在我的 Linux 生产服务器上工作。所以,我不认为这是问题的网址。另外,延长 curl 的超时时间也没有任何效果。
  • 你检查过 curl 返回的状态码吗?使用$info = curl_getinfo($ch) 获取此信息并将$info 存储在某个日志文件中。让站点运行一段时间,然后检查日志文件以获取传输详细信息。
  • 这里有两件事:首先,您可以尝试删除超时或将其增加到更高的值。有时建立联系只需要时间。其次,如果cURL不是必需的,您可以尝试在简单的html dom中直接使用file_get_html($webpage);

标签: php curl simpledom


【解决方案1】:

在调用curl_close 之前尝试使用curl_getinfo。除了大量其他有用信息外,它还会为您提供 HTTP 状态代码,让您知道您的请求发生了什么。这应该会给你你需要的答案...只要确保删除 CURLOPT_FAILONERROR 设置(或将其设置为 false)。

【讨论】:

    【解决方案2】:

    我的错误日志显示“调用未定义函数 mb_detect_encoding()”。该函数需要启用 mbstring 扩展(simple_html_dom.php 需要它)。 MAMP 默认安装了这个,这就是为什么它可以在我的开发服务器上工作,但不能在我的生产服务器上工作。我已经请求在我的 Linux 生产服务器上启用 mbstring,所以如果这实际上是问题所在,我会让大家知道。我在网上看到过很多人有同样问题的帖子,所以我希望这会对很多人有所帮助。

    【讨论】:

    • 是的,就是这样。我注意到很多人似乎有同样的问题。这让我很头疼。只需确保在 PHP 上启用了 mbstring 扩展。
    【解决方案3】:

    您的问题是很久以前的问题,但这是我的解决方案。 我有同样的问题,curl 在我的 Windows 机器上本地工作,但不在 Linux 上。只是一些网址,而不是全部。 我使用的 CURLOPT_SSL_VERIFYPEER 设置为 false,然后我也添加了 CURLOPT_SSL_VERIFYHOST。 至少在我的情况下,url 不起作用是由于我试图访问的域没有很好地定义 SSL 证书。 我不知道为什么即使没有这个参数它也能在 Windows 上工作,但它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 2022-09-29
      相关资源
      最近更新 更多