Параметр PHP file_get_contents с https возвращает false

Все примеры в php.net относительно URL продемонстрированы только с http, а не с https. Я действительно не понимаю, почему это не было продемонстрировано с https. File_get_contents возвращает true для URL-адреса http и false для URL-адреса https.

  1. Нужно ли что-то включать на сервере, где выполняется эта функция?
  2. Я знаю, что это логическая ошибка, но эта логическая ошибка происходит во встроенной функции. У меня нет синтаксической ошибки. Что мне здесь не хватает?
  3. Мой ожидаемый результат состоит в том, чтобы получить true возврат из file_get_contents, когда в него передается URL-адрес https.

Код:

function connectMe() {
   $urlHeader = $_REQUEST['urlHeader'];
   // if this is a http url it's working for file_get_contents returns true
   // if this is a https url it's not working file_get_contents gives false
   $status = send($urlHeader);
   var_dump($status);
   echo $status ? 'success' : 'failed';
   exit;
}

function send($url) {
    $ctx = stream_context_create(
        array(
        'http'=>array(
        'header'=>"Content-type: application/x-www-form-urlencoded",
        'method'=>'POST',
        'content'=>NULL
        )
      )
    );
var_dump(stream_get_wrappers());
$w = stream_get_wrappers();
echo 'openssl: ',  extension_loaded  ('openssl') ? 'yes':'no', "\n";
echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n";
echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n";
echo 'wrappers: ', var_export($w);
return file_get_contents($url, 0, $ctx);
}

Примечание. 1. Приведенный выше код был интегрирован в соответствии с решением, приведенным в stackoverflow, где ничего не изменилось в результате. 2. openssl включен, а allow_url_fopen включен.

ВЫВОД, который я получаю:

массив(9) { [0]=> строка(5) "https" [1]=> строка(4) "ftps" [2]=> строка(3) "php" [3]=> строка(4) "файл" [4]=> строка(4) "glob" [5]=> строка(4) "данные" [6]=> строка(4) "http" [7]=> строка(3) "ftp " [8]=> строка(4) "фар" }

openssl: да HTTP-оболочка: да https-оболочка: да оболочки: массив ( 0 => 'https', 1 => 'ftps', 2 => 'php', 3 => 'файл', 4 => 'glob', 5 => 'данные', 6 => 'http', 7 => 'ftp', 8 => 'phar', )

Предупреждение: file_get_contents(): php_network_getaddresses: gethostbyname не удалось. errno=0 в FILENAME.PHP в строке 40

Предупреждение: file_get_contents(https://someIPhere или веб-сайт): не удалось открыть поток: php_network_getaddresses: ошибка gethostbyname. errno=0 в FILENAME.PHP в строке 40

bool(false) не удалось


person Common Man    schedule 12.10.2017    source источник
comment
Вы уверены, что $_REQUEST('urlHeader'); правильно? $_REQUEST не является функцией   -  person apokryfos    schedule 12.10.2017
comment
Возможно, эта ссылка может помочь   -  person Nebojsa Nebojsa    schedule 12.10.2017
comment
Возможный дубликат Как заставить file_get_contents() работать с HTTPS?   -  person Patrick Q    schedule 12.10.2017
comment
Убедитесь, что у вас есть это в вашей конфигурации php: extension=php_openssl.dll allow_url_fopen = On   -  person teeyo    schedule 12.10.2017
comment
@PatrickQ - это невозможный дубликат. Stackoverflow так не работает. Каждая проблема уникальна. Вы не можете вписаться в мою проблему для чужого решения. Я пробовал решение этой ссылки, и мне ничего не помогло.   -  person Common Man    schedule 12.10.2017
comment
@apokryfos Я думаю, это должно быть $_REQUEST['urlHeader'];   -  person    schedule 12.10.2017
comment
@CommonMan На самом деле, именно так работает SO. Многие вопросы, размещенные здесь, дублируются. И вы не указали, что у вас есть какая-либо базовая отладка этой проблемы. Пожалуйста, просветите нас о том, что вы сделали, чтобы попытаться решить эту проблему, и каковы были результаты этих попыток.   -  person Patrick Q    schedule 12.10.2017
comment
Я пробовал с file(), и он возвращает то же самое false. Затем parse_url, который полностью предназначен для другого использования.   -  person Common Man    schedule 12.10.2017
comment
спасибо за закрытие, но у кого много баллов, может ли кто-нибудь поместиться в stackoverflow.com/questions/1975461/ к моей проблеме. Потому что я пробовал, и ничего не изменилось. Вы, должно быть, устали видеть похожие проблемы с очень и очень незначительной разницей. Я согласен.   -  person Common Man    schedule 12.10.2017
comment
@CommonMan Если вы хотите, чтобы люди не предполагали, что это дубликат, вам нужно объяснить, как вы попробовали решение, предложенное в предложенном дубликате, и почему оно не сработало. Можете ли вы поделиться выводами stream_get_wrappers() и extension_loaded('openssl'), например?   -  person apokryfos    schedule 12.10.2017
comment
@apokryfos - Пожалуйста, проверьте обновление и отредактируйте вопрос.   -  person Common Man    schedule 12.10.2017
comment
Ошибка @CommonMan gethostbyname означает, что это проблема DNS. Проверьте, можете ли вы пропинговать этот хост. Также рекомендуется предоставить как можно больше информации в вопросе.   -  person apokryfos    schedule 12.10.2017
comment
@apokryfos - IP-адрес, к которому я пытаюсь подключиться, не работает. Проверял через: пинг в cmd и в браузере тоже.   -  person Common Man    schedule 12.10.2017
comment
@PatrickQ - решение интегрировано с моей проблемой. В конечном результате изменений нет. Этот вопрос все еще будет дублироваться !? Я согласен, что это дубликат, поскольку участники и модераторы с высокими баллами могут его отметить.   -  person Common Man    schedule 12.10.2017


Ответы (1)


Скорее всего, вы указываете на самоподписанный ssl. Если так, то это может быть причиной. Убедитесь, что URL-адрес имеет действующий сертификат SSL.

Если вы хотите обойти проверку SSL, вам нужно будет добавить stream_context_create, чтобы установить «verify_peer» => false.

см.: file_get_contents(): операция SSL ошибка с кодом 1 (сбой проверки сертификата)

person ggedde    schedule 12.10.2017
comment
... что снова сделало бы исходный вопрос дубликатом :) - person CD001; 12.10.2017