我正在使用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,进度条消失,但链接没有出现在页面上,没有任何内容存储到我的数据库。我错过了什么?
答案 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上工作,但它对我有用。