为什么PHP的cURL在某些URL上似乎“超时”?

时间:2012-08-05 04:45:10

标签: php curl simpledom

我正在使用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,描述和webpage_name存储在我的数据库中,但是对于另一半,它们不会被存储,并且脚本会停止。也就是说,当用户向我的网站提交URL时,会在URL上传到我的网站时显示进度条。然后,进度条消失,URL显示在我的网页上,供用户在URL提交完成后查看。对于麻烦的URL,进度条消失,但链接没有出现在页面上,没有任何内容存储到我的数据库。我错过了什么?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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