致命错误:未捕获的CurlException:7:无法连接到第887行的.... src / base_facebook.php中抛出的主机

时间:2013-09-18 06:13:48

标签: php facebook facebook-graph-api oauth-2.0 facebook-php-sdk

我正在尝试按照示例here

开发示例facebook php登录示例

我托管了我的应用here,但每当我尝试访问该链接时,我都会在问题中收到错误消息。这是抛出错误的代码段

try {
  $e = new FacebookApiException(array(// LINE 887
             'error_code' => curl_errno($ch),
             'error' => array(
             'message' => curl_error($ch),
             'type' => 'CurlException',
        ),
  ));
  curl_close($ch);
}

// edit suggested by Kneel-before ZOD
catch(FacebookApiException $e) {
  $result = $e->getResult();
  echo 'Got an : ', $e->getType(),' while posting';
  echo(json_encode($result));
}

catch(Exception $e){
  echo 'Caught exception: ',  $e->getMessage(), "\n";
}

我非常确定我已经在index.php中正确设置了APP ID和密码。

以下是我在Facebook App setup

上设置应用的屏幕截图

任何帮助将不胜感激。谢谢!

11 个答案:

答案 0 :(得分:1)

您可能需要为Facebook提供curl证书文件,您可以这样做:

https://github.com/facebookarchive/facebook-php-sdk/blob/master/src/fb_ca_chain_bundle.crt

下载证书文件

并在尝试任何Facebook通话之前添加此内容

facebook::$CURL_OPTS[CURLOPT_CAINFO] = 'path/to/fb_ca_chain_bundle.crt';

您也可以尝试

facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYPEER] = false;
facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYHOST] = 2;

答案 1 :(得分:0)

为什么要在try块上创建例外?

我当前的工作登录功能是这样的:

public function login()
{               
    $this->load->library('facebook/facebook',$config);
    $uid = $this->facebook->getUser();

    if ($uid) 
    {           
      try 
      {             
        $user_profile = $this->facebook->api('/' . $uid);  

        //then redirect to whatever you need..
      } 
      catch (FacebookApiException $e) 
      { error_log($e);
        $uid = null;
        $this->facebook->destroySession();
      }
    }
    else 
    {
        $params = array(
            'canvas'    => 1,
            'fbconnect' => 0,
            'scope' => 'email',
        );
        echo "<script>top.location.href='" . $this->facebook->getLoginUrl($params)."'</script>";            
        exit();
    }
}

答案 2 :(得分:0)

我遇到了和你一样的问题。

我在base_facebook.php

中的curl_exec()之前添加了此选项
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

答案 3 :(得分:0)

如果您使用免费托管,我认为它可能无法正常工作,主要是因为它们通常会禁用传出连接。我也遇到过这个问题,代码在付费托管(或启用传出连接)上运行顺畅。

答案 4 :(得分:0)

您正在try ... catch块中创建一个例外。你不需要做这些事情。 try-catch块设计用于处理可能在您的应用程序中引发异常的代码段。 您需要将可能引发异常的块代码段放入其中。在您的情况下,它可能是对Facebook API的cURL请求。

答案 5 :(得分:0)

它与您的代码无关。 Curl根本无法连接到facebook图谱API。这可能是因为您的主机阻止了与其他主机的传出连接,或者Facebook阻止了您的主机。

如果您有ssh访问权限,可以尝试访问http://graph.facebook.com和/或检查您的php日志。否则你应该问你的主人。

答案 6 :(得分:0)

链接为https您可能需要提供证书信息,如果您无法访问证书然后添加

,则curl通常会抛出错误
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

将允许访问任何证书。

答案 7 :(得分:0)

设置代理连接Facebook.com

##在base_facebook.php中找到代码#

public static $CURL_OPTS = array(
        CURLOPT_CONNECTTIMEOUT => 10,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 60,
        CURLOPT_USERAGENT      => 'facebook-php-3.2',
      );

添加选项

  public static $CURL_OPTS = array(
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_USERAGENT      => 'facebook-php-3.2',
    CURLOPT_PROXY      => '199.200.120.140:8089',
  );

答案 8 :(得分:0)

根据Ashutosh Bajpay的建议,您的网络服务器很可能无法根据错误消息进行连接。如果您使用的是共享托管服务提供商,或启用了SELinux,那么您的代码将无法启动新连接,这是非常合理的。

你可以编写一个快速而肮脏的脚本来测试这个理论:

$page = file_get_contents('http://google.com');
(!empty($page)) ? var_dump($page) : print_r(error_get_last());

如果脚本可以连接,您将获得页面转储,否则您应该看到它尝试访问主机时出错。

如果您确实控制了该框,并且恰好运行了SELinux,则会提供一些有用的提示here

答案 9 :(得分:0)

检查php.ini允许卷曲功能。对于ubuntu,请在终端中尝试此代码

sudo apt-get install php5-curl

使用

重启Apache服务器后

sudo service apache2 restart

答案 10 :(得分:0)

您正在捕获两个异常类型,也不是“抛出”的异常。尝试捕获引发的异常,并在该异常块中,您将能够进一步调试您的问题(例如在异常期间显示正在播放的变量......)然后您可以构建一个简单的页面来测试每个部分直到你解决它为止。