为什么PHP';s的cURL显示为';timeout';在某些URL上


Why does PHP's cURL appear to 'timeout' on certain URLs?

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

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

我的错误日志显示"调用未定义的函数mb_detect_encoding()"。这个函数要求启用mbstring扩展(simple_html_dom.php需要它)。MAMP默认情况下确实安装了这个扩展,这就是为什么它在我的开发服务器上工作,但在我的生产服务器上不工作。我已经请求在我的Linux生产服务器上启用mbstring,所以我会让每个人都知道这是否真的是问题所在。我在网上看到了一些有同样问题的人的帖子,所以我希望这能帮助很多人。

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