致命错误:未捕获卷曲异常:7:无法';t连接到第887行中抛出的主机…src/base_facebook.php

致命错误:未捕获卷曲异常:7:无法';t连接到第887行中抛出的主机…src/base_facebook.php,php,facebook,facebook-graph-api,oauth-2.0,facebook-php-sdk,Php,Facebook,Facebook Graph Api,Oauth 2.0,Facebook Php Sdk,我正试图按照下面的示例开发一个facebook php登录示例 我已经托管了我的应用程序,但每当我尝试访问链接时,都会收到问题中的错误消息。下面是抛出错误的代码段 try { $e = new FacebookApiException(array(// LINE 887 'error_code' => curl_errno($ch), 'error' => array( 'message' =>

我正试图按照下面的示例开发一个facebook php登录示例

我已经托管了我的应用程序,但每当我尝试访问链接时,都会收到问题中的错误消息。下面是抛出错误的代码段

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中正确设置了应用程序ID和密码

这是我在facebook上安装应用程序的截图


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

为什么要在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();
    }
}
公共函数登录()
{               
$this->load->library('facebook/facebook',$config);
$uid=$this->facebook->getUser();
如果($uid)
{           
尝试
{             
$user_profile=$this->facebook->api('/'.$uid);
//然后重定向到您需要的任何内容。。
} 
捕获(FacebookApiException$e)
{错误日志($e);
$uid=null;
$this->facebook->destroySession();
}
}
其他的
{
$params=数组(
“画布”=>1,
“fbconnect”=>0,
“范围”=>“电子邮件”,
);
echo“top.location.href=”$this->facebook->getLoginUrl($params)。“;
退出();
}
}

我和你有同样的问题

我在base\u facebook.php中的
curl\u exec()
之前添加了此选项

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

如果你使用的是免费主机,我认为它可能不会起作用,主要是因为它们通常会禁用传出连接。我也遇到了这个问题,因为代码在付费主机上运行得很顺利(或启用了传出连接)。

您在try中创建了一个异常。。。挡块。你不需要做这样的事情。尝试catch块,该块用于处理可能在应用程序中引发异常的代码段。
您需要将可能引发异常的块代码段放入其中。在您的情况下,它可能是对Facebook API的一个cURL请求。

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


如果您有ssh访问权限,您可以尝试访问和/或检查php日志。否则,您应该询问您的主机。

链接是https,您可能必须提供证书信息,否则如果您没有访问证书的权限,curl通常会抛出错误,然后添加

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
将允许访问任何证书。

设置代理以连接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',
    CURLOPT_PROXY      => '199.200.120.140:8089',
  );

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

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();
    }
}
从下载证书文件

并在尝试任何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;

正如Ashutosh Bajpay所建议的,您的web服务器可能无法根据错误消息进行连接。如果您使用的是共享主机提供程序,或者启用了SELinux,那么您的代码很可能无法启动新的连接

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

$page = file_get_contents('http://google.com');
(!empty($page)) ? var_dump($page) : print_r(error_get_last());
如果脚本可以连接,您将获得页面的转储,否则您将看到它试图访问主机时出错


如果您确实控制了该框,并且它恰好运行了SELinux,那么有一些有用的提示。

检查您的
php.ini
允许使用curl函数

对于ubantu,请尝试在终端中输入此代码

sudo apt-get install php5-curl
之后,使用以下命令重新启动apache服务器:


sudo service apache2 restart

您正在捕获两种异常类型,被“抛出”的异常也不是。尝试捕获抛出的异常,在该异常块中,您将能够进一步调试您的问题(例如,在异常期间显示正在运行的变量…),然后您可以构建一个简单的页面来测试拼图的每个部分,直到您修复它。

您检查了
主机的URL吗?@跪在ZOD面前。我不明白你的意思?AFAI看,
主机
url是。我在这里遗漏了什么吗?FBAPI中的主机是否匹配http://cse591.host56.com/?没关系;图像回答了这个问题。检查错误的位置并粘贴内容。@Kneel Before ZOD:i在问题中发布了相关的代码行。请注意,错误是从库文件而不是我的客户端代码中抛出的。我的客户机代码与上面的文件类似。是基于base_facebook.php的哪个函数?我在档案里找不到那些行。确保您使用的是最新版本。是。我刚刚使用了facebook的php-sdk页面上的最新版本,它给了我
解析错误:语法错误,在第20行的/home/a8815401/facebook/src/base_facebook.php中出现意外的T_。这是第20行的代码
curl_exec(),如果(!function_exists('curl_init')){//line20抛出新的异常('Facebook需要curl PHP扩展。;)}
我在第962行添加了这个选项。我在前一行删除了它,并在第962行添加了它。我现在收到一个警告和一个错误<代码>警告:curl_setopt()[function.curl setopt]:第962行/home/a8815401/facebook/src/base_facebook.php中的curl配置选项无效。致命错误:未捕获的curl异常:7:无法连接到第994行/home/a8815401/facebook/src/base_facebook.php中抛出的主机。有什么想法吗?