Не удалось найти оболочку "https" с файлом_get_contents

Вызов file_get_contents() с помощью https://url дает мне следующую ошибку:

warning: file_get_contents(): Unable to find the wrapper "https" - did you forget to enable it when you configured PHP?

Я прочитал 10+ вопросов SO, и все они говорят, чтобы включить extension=php_openssl.dll

Я сделал это, и у меня все еще есть проблемы...

Что еще может быть?

Ответ 1

РЕШИТЬ

Чтобы устранить эту ошибку, вам нужно установить пакет OpenSSL для PHP на ваш веб-сервер.

На сервере FreeBSD вам может потребоваться установить следующий пакет: php53_openssl и перезапустить ваш веб-сервер.

На сервере Windows откройте файл конфигурации php.ini и просто раскомментируйте следующую строку:

 ;extension=php_openssl

и перезапустите веб-сервер. Ошибка должна быть устранена.

Справка: я исхожу из этой ссылки, которая сработала для меня.., так что заслуга ему.

Ответ 2

Для PHP 7 в 64-битной Windows обязательно поместите libcrypto-1_1-x64.dll в путь переменной среды. Например: C:\php\libcrypto-1_1-x64.dll;

Ответ 3

У меня была та же проблема. Я пытался получить доступ к графику facebook. Дело не в том, что он не мог получить доступ к URL-адресу, а именно, что Facebook возвращал ошибку 400, потому что я не пропускал параметры. Попробуйте подключиться к HTTPS на сайте, на котором будет работать HTTPS-соединение. Например. Попробуйте следующее:

file_get_contents("https://www.namhost.com");

Если это работает, вы должны понять, почему соединение HTTPs, с которым вы подключаетесь, терпит неудачу, потому что проблема заключается не в том, что вы не можете подключиться к HTTP-адресам, а скорее к тому, что то, к чему вы подключаетесь, не нравится запрос.

Ответ 4

Как говорят люди, проверьте конфигурацию.

phpinfo.php

<?php
phpinfo();
?>

Найдите OpenSSL на веб-странице. Кроме того, не забудьте перезапустить WebServer после изменения файла php.ini.

Если вы не можете использовать file_get_contents(), используйте cURL, если это возможно, лучше во многих отношениях и быстрее.

function url($url,$option = null) {

    $cURL = curl_init();

    if ($option) {
        curl_setopt($cURL, CURLOPT_URL, $url.$option);
    } else {
        curl_setopt($cURL, CURLOPT_URL, $url);
    }

    curl_setopt($cURL, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($cURL, CURLOPT_AUTOREFERER, 1);
    curl_setopt($cURL, CURLOPT_HTTPGET, 1);
    curl_setopt($cURL, CURLOPT_VERBOSE, 0);
    curl_setopt($cURL, CURLOPT_HEADER, 0);
    curl_setopt($cURL, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($cURL, CURLOPT_SSL_VERIFYPEER, 1);
    curl_setopt($cURL, CURLOPT_SSL_VERIFYHOST, 1);
    curl_setopt($cURL, CURLOPT_DNS_USE_GLOBAL_CACHE, 0);
    curl_setopt($cURL, CURLOPT_DNS_CACHE_TIMEOUT, 2);

    $output['page'] = curl_exec($cURL);
    $output['contentType'] = curl_getinfo($cURL, CURLINFO_CONTENT_TYPE);

    curl_close($cURL);

    return $output;

}

$page = url('https://example.com/','i/like/subfolders');

Ответ 5

Я просто хотел добавить этот кусочек, потому что я часами боролся с этой проблемой и, наконец, понял, что работает. В большинстве таких установок WAMP/XAMP/MAMP файлы конфигурации помещаются в нестандартные каталоги (например, C:\MAMP\conf\php\php7.2.10\php.ini). Вы должны убедиться, что ваш php cli загрузил изменяемый вами INI.

$ php --ini

Если он не указывает на правильный INI или вообще не загружает файл конфигурации, вы можете изменить переменную среды PHPRC, чтобы пользователь, выполняющий сценарий, указывал на правильное расположение INI, которое вы правильно изменили. Также убедитесь, что параметр extension_dir в php.ini содержит правильный путь к месту хранения ваших расширений.

Надеюсь это поможет.

Ответ 6

Убедитесь, что allow_url_include и allow_url_fopen установлены в 'On' в php.ini.

Раскомментируйте их, если эти строки прокомментированы.

Кроме того, для диагностики можно использовать следующий script: (взято из принятого ответа на Как заставить file_get_contents() работать с HTTPS?)

$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_dump($w);