Php 无法使用curl请求连接到Facebook

Php 无法使用curl请求连接到Facebook,php,facebook,facebook-graph-api,curl,Php,Facebook,Facebook Graph Api,Curl,几周前,我创建了一个简单的Facebook应用程序。我通过请求用户的许可,通过Facebook API获取用户信息。但它上周突然停止了工作,从那以后我一直在寻找答案 基本上,我使用文件获取内容从Facebook API获取用户信息。但在它开始失败后,我尝试将它改为卷曲,但仍然不起作用。我尝试使用Facebook PHP-SDK,甚至调试了makeRequest方法的代码,但在所有方法中都得到了相同的返回 当向Facebook Open Graph URL发出cURL请求时,请求失败,错误号为7或

几周前,我创建了一个简单的Facebook应用程序。我通过请求用户的许可,通过Facebook API获取用户信息。但它上周突然停止了工作,从那以后我一直在寻找答案

基本上,我使用文件获取内容从Facebook API获取用户信息。但在它开始失败后,我尝试将它改为卷曲,但仍然不起作用。我尝试使用Facebook PHP-SDK,甚至调试了makeRequest方法的代码,但在所有方法中都得到了相同的返回

当向Facebook Open Graph URL发出cURL请求时,请求失败,错误号为7或28。它们都是无法连接到站点或超时的错误代码

我的网站是在一个共享主机上的,我尝试过使用cURL来获取其他网站,效果很好。但当我试图达到平衡时,cURL返回FALSE

主机具有SSL证书,启用了cURL等,并且在不久前工作正常。我已经阅读了很多关于这个的文章,尝试了很多不同的卷曲选项,但是没有一个是有效的

有什么想法吗

index.php
$auth\u url=”https://www.facebook.com/dialog/oauth?client_id=" . $应用程序id。“&重定向_uri=”。urlencode($GLOBALS['canvas_page'])。“&scope=publish\u流,电子邮件”;
$signed_request=$_POST[“signed_request”];
列表($encoded_sig,$payload)=分解('.',$signed_请求,2);
$data=json_解码(base64_解码(strtr($payload,'-'','+/')),true);
if(空($data[“user\u id”])){
echo(“top.location.href=”。$auth_url。””;
}否则{
$\u会话['oauth\u令牌]=$data['oauth\u令牌'];
$\u会话['user\u id']=$data[“user\u id”];
$user=新用户($\u会话['user\u id',$\u会话['oauth\u令牌]);
用户类 函数构造($fid,$at){ $this->facebook=新facebook(数组)( “appId”=>“”, “机密”=>“”, )); $this->fid=$fid; $this->token=$at; 如果($data=$this->getGraph()){ ... } } 公共函数getGraph(){ $session=$this->facebook->getUser(); 如果($会议){ 试一试{ $access_token=$this->facebook->getAccessToken(); $attachment=array('access\u token'=>$access\u token); //$result=$this->facebook->api('/'.$this->fid,'GET',$attachment); $result=$this->facebook->api('/'.$this->fid,'GET'); 返回$result; }捕获(FacebookApiException$e){ 返回false; } } } 注意事项:

  • 在检查了FacebookPHPSDK方法之后,我意识到我不需要发送访问令牌,因为如果访问令牌不在$params中,它将设置它
  • 它转到sdk中的makeRequest()方法,并从curl_exec返回false

显然,这与Facebook的循环DNS结构有关。我猜Facebook的一个地址失败,服务器仍在尝试连接到该地址,因为DNS缓存

托管提供商必须清除DNS缓存才能解决此问题


有关循环DNS的更多信息,您可以访问。

您可以发布应用程序初始化和curl代码吗?网络架构是否有任何更改?防火墙?ips?主机文件?您可以从命令行ping graph.facebook.com吗?您可以使用curl作为命令行,并使用-v选项查看更多信息吗?我没有shell访问权限,site托管在共享服务器上。但通过清除DNS缓存解决了该问题。这与Facebook使用的循环DNS技术有关。我自己无法回答这个问题,因为我没有足够的代表。如果您可以单独发布您的答案并将其选为已接受的答案,这将有助于寻找答案的人对于未回答的问题。
$auth_url = "https://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . urlencode($GLOBALS['canvas_page']) . "&scope=publish_stream,email";
$signed_request = $_POST["signed_request"];
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);
if (empty($data["user_id"])) {
    echo("<script> top.location.href='" . $auth_url . "'</script>");
} else {
    $_SESSION['oauth_token'] = $data['oauth_token'];
    $_SESSION['user_id'] = $data["user_id"];
    $user = new User($_SESSION['user_id'], $_SESSION['oauth_token']);
function __construct($fid, $at) {
    $this->facebook = new Facebook(array(
                'appId' => "<APP_ID>",
                'secret' => "<FACEBOOK_SECRET_ID>",
            ));
    $this->fid = $fid;
    $this->token = $at;
    if ($data = $this->getGraph()) {
    ...
    }
}

public function getGraph() {
    $session = $this->facebook->getUser();
    if ($session) {
        try {
            $access_token = $this->facebook->getAccessToken();
            $attachment = array('access_token' => $access_token);
            //$result = $this->facebook->api('/' . $this->fid, 'GET', $attachment);
            $result = $this->facebook->api('/' . $this->fid, 'GET');
            return $result;
        } catch (FacebookApiException $e) {
            return false;
        }
    }
}