【问题标题】:Fatal error: Uncaught CurlException: 7: couldn't connect to host thrown in ....src/base_facebook.php on line 887致命错误:未捕获的 CurlException:7:无法连接到第 887 行 ....src/base_facebook.php 中抛出的主机
【发布时间】:2013-09-22 18:58:21
【问题描述】:

我正在尝试按照示例 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 和 secret。

这是我在 facebook 上设置应用程序的屏幕截图

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

【问题讨论】:

  • 你检查过host的网址吗?
  • @Kneel-Before-ZOD。我不明白你吗? AFAI 看到,host 网址是 cse591.host56.com。我在这里错过了什么吗?
  • FB API 中的 host 是否匹配 http://cse591.host56.com/
  • 没关系;图片回答了这个问题。检查错误位置并粘贴内容。
  • @Kneel-Before-ZOD:我已经在问题中发布了相关代码行。请看一下

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


【解决方案1】:

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

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;

【讨论】:

    【解决方案2】:

    为什么要在 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();
        }
    }
    

    【讨论】:

    • 错误是从库文件而不是我的客户端代码中抛出的。我的客户端代码和你上面的文件类似。
    • 嗯嗯。它在base_facebook.php 上哪个函数?我在我的文件中找不到这些行。确保您使用的是最新版本。
    • 是的。我刚刚使用了来自 facebook 的 php -sdk 页面的最新版本
    【解决方案3】:

    我和你有同样的问题。

    我在 base_facebook.php 中的 curl_exec() 之前添加了这个选项

    curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
    

    【讨论】:

    • 这给了我Parse error: syntax error, unexpected T_IF in /home/a8815401/facebook/src/base_facebook.php on line 20。这是第 20 行的代码curl_exec() if (!function_exists('curl_init')) { //line20 throw new Exception('Facebook needs the CURL PHP extension.'); }
    • 我将此选项添加到第 962 行。base_facebook.php
    • 我在前一行删除了它并在第 962 行添加了它。我现在收到一个警告和一个错误。 Warning: curl_setopt() [function.curl-setopt]: Invalid curl configuration option in /home/a8815401/facebook/src/base_facebook.php on line 962Fatal error: Uncaught CurlException: 7: couldn't connect to host thrown in /home/a8815401/facebook/src/base_facebook.php on line 994。有什么想法吗?
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      您正在 try ... catch 块中创建异常。你不需要做这样的事情。 try-catch 块旨在处理可能在应用程序中引发异常的代码段。 您需要在此块内放入可以引发异常的代码段。在您的情况下,它可能是对 Facebook API 的 cURL 请求。

      【讨论】:

        【解决方案6】:

        链接是 https,您可能需要提供证书信息,否则如果您无权访问证书然后添加,curl 通常会抛出错误

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        

        将允许访问任何证书。

        【讨论】:

          【解决方案7】:

          设置代理以连接 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】:

            根据 Ashutosh Bajpay 的建议,根据错误消息,您的网络服务器可能无法连接。如果您使用的是共享托管服务提供商,或者启用了 SELinux,那么您的代码很可能无法发起新的连接。

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

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

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

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

            【讨论】:

              【解决方案9】:

              检查您的php.ini 是否允许使用 curl 功能。

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

              sudo apt-get install php5-curl
              

              在它重新启动你的 apache 服务器之后使用

              sudo service apache2 restart

              【讨论】:

                【解决方案10】:

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

                【讨论】:

                  【解决方案11】:

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

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

                  【讨论】:

                    猜你喜欢
                    • 2012-06-19
                    • 2012-12-12
                    • 2014-07-26
                    • 2012-01-24
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-08-30
                    • 1970-01-01
                    相关资源
                    最近更新 更多