如何使用CURL代替file_get_contents函数?

42

我使用file_get_contents函数获取并在特定页面上显示外部链接。

在我的本地文件中一切正常,但是我的服务器不支持file_get_contents函数,因此我尝试使用以下代码的cURL:

function file_get_contents_curl($url) {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);

    $data = curl_exec($ch);
    curl_close($ch);

    return $data;
}

 echo file_get_contents_curl('http://google.com');

但它返回一个空白页面。出了什么问题?


3
curl_error 是什么意思? - Book Of Zeus
2
你的代码正在运行,也许没有安装curl?在phpinfo()中检查一下。 - malletjo
3
你没有进行错误检查,然后想知道为什么没有出现任何错误。这是不明智的。 - Pekka
1
我怀疑如果您的托管提供商已禁用fopen包装器(file_get_contents()需要使用),那么他们也没有安装curl。如果这是您自己的服务器,则在PHP配置中启用allow_url_fopen - Brian
1
在phpinfo中, cURL支持已启用 - Morteza
在本地获取这条消息:文档已移动至此处。 - Morteza
4个回答

89

试试这个:

function file_get_contents_curl($url) {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);       

    $data = curl_exec($ch);
    curl_close($ch);

    return $data;
}

2
Curl 返回空内容.. 我该如何避免这种情况? - 151291
1
@151291 添加以下配置对我有用: curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); - Bhavin Visariya

11

这应该可以运行

function curl_load($url){
    curl_setopt($ch=curl_init(), CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($ch);
    curl_close($ch);
    return $response;
}

$url = "http://www.google.com";
echo curl_load($url);

3
这段代码的行为与file_get_contents不完全相同。你的代码将不会跟随重定向,而file_get_contents则会这样做。 - Casper André Casse

4

//你可以尝试这个方法。它应该能够正常工作。

function curl_tt($url){

$ch = curl_init();

curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);  
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 3);     
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$data = curl_exec($ch);
curl_close($ch);

return $data;
}
echo curl_tt("https://google.com");

4

我在通过直接链接访问Google Drive内容时遇到了这样的问题。

调用file_get_contents后返回302 Moved temporarily。

//Any google url. This example is fake for Google Drive direct link.
$url = "https://drive.google.com/uc?id=0BxQKKJYjuNElbFBNUlBndmVHHAj";
$html = file_get_contents($url);
echo $html; //print none because error 302.

在下面的代码中它又可以工作了:
//Any google url. This example is fake for Google Drive direct link.
$url = "https://drive.google.com/uc?id=0BxQKKJYjuNElbFBNUlBndmVHHAj";

$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);  
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 3);     
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$html = curl_exec($ch);
curl_close($ch);

echo $html;

我今天进行了测试,日期是03/19/2018


1
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); 让我困扰了很长时间,太棒了,你发现了! - Bing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接