Fatal error: Uncaught CurlException: 7: не удалось подключиться к хосту, который был добавлен в... src/base_facebook.php в строке 887

Я пытаюсь разработать пример для входа в 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";
}

Я уверен, что Ive правильно настроил идентификатор APP и секрет в index.php.

Вот скриншот моей настройки приложения на facebook App setup

Любая помощь будет оценена по достоинству. Спасибо!

Ответ 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();
    }
}

Ответ 3

У меня была такая же проблема, как и вы.

Я добавляю эту опцию перед curl_exec() в base_facebook.php

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

Ответ 4

Если вы используете бесплатный хостинг, я думаю, что это может не сработать, главным образом потому, что обычно отключено исходящее соединение. Я также столкнулся с этой проблемой с кодом, который работал плавно на платный хостинг (или исходящее соединение включено).

Ответ 5

Вы создаете исключение в try... catch block. Вам не нужно делать такие вещи. блок try-catch, предназначенный для обработки сегментов кода, которые могут вызывать исключение в ваших приложениях. Вы должны поместить внутри сегментов блочного кода, которые могут вызывать исключение. В вашем случае это может быть запрос cURL API Facebook.

Ответ 6

Это не имеет никакого отношения к вашему коду. Curl просто не может подключиться к API-интерфейсу facebook. Это может быть связано с тем, что ваш хост блокирует исходящие соединения с другими хостами, или facebook блокирует ваш хост.

Если у вас есть доступ к ssh, вы можете попытаться достичь http://graph.facebook.com и/или проверить свои журналы php. В противном случае вы должны спросить своего хоста.

Ответ 7

Ссылка https, которую вы, возможно, должны указывать в информации о сертификате или завитке, обычно выдает ошибку, если у вас нет доступа к сертификату, а затем добавьте

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

разрешит доступ к любому сертификату.

Ответ 8

Установить прокси для подключения 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',
  );

Ответ 9

Как было предложено Ashutosh Bajpay, скорее всего, ваш веб-сервер не сможет подключиться на основе сообщения об ошибке. Если вы используете общий хостинг-провайдер или имеете SELinux, очень правдоподобно, что ваш код не сможет инициировать новое подключение.

Вы можете написать быстрый и грязный script, чтобы проверить эту теорию:

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

Если script может подключиться, вы получите дамп страницы, в противном случае вы должны увидеть сообщение об ошибке, пытающееся добраться до хоста.

Если у вас есть контроль над этим полем, и это происходит при запуске SELinux, здесь есть несколько полезных советов здесь.

Ответ 10

Проверьте, что функция php.ini позволяет выполнять завиток.

Для ubantu попробуйте этот код в терминале

sudo apt-get install php5-curl

После перезапуска сервера apache с помощью

sudo service apache2 restart

Ответ 11

Вы ловите два типа исключений, и это не исключение, которое "выбрано". Попробуйте поймать исключение, которое будет выброшено, и внутри этого блока исключений вы сможете продолжить отладку своей проблемы (например, показывая переменные в игре во время исключения...), тогда вы можете создать простую страницу для проверки каждой части головоломку, пока вы ее не исправите.