Неможливо знайти обгортку “https” - ви забули включити її під час налаштування PHP?


143

Проблема полягає у питанні. Я провів ретельне дослідження щодо вирішення цього питання, і я знаю, що для цього є теми, і я також дотримувався їх, і нічого не вийшло. Як сказано, я перерахую саме все, що я зробив досі. Я запускаю PHP 5.2.14 із налагодженням Zend на останній версії Eclipse на моєму комп'ютері Windows XP. У мене є 1 ГБ оперативної пам’яті. У мене встановлено XAMPP з Apache, MySQL та FileZilla.

На XAMPP я зробив наступне (Apache був вимкнений під час цих змін): Натиснув на адміністратора з панелі керування XAMPP і перейшов до https:// localhost/xampp/. Звідти я прийняв сертифікати з цього рядка на вітальній сторінці:

Для підтримки OpenSSL використовуйте тестовий сертифікат з https: // 127.0.0.1 або https: // localhost.

На тому самому розділі я перевірив phpinfo(). У розділі "Навколишнє середовище" SERVER["HTTPS"]є on. Під "Apache Environment" HTTPSє On. У розділі "Змінні PHP, _SERVER["HTTPS"]є On. Під «Phar», OpenSSL supportє disabled(встановити ext / openssl). Я не знаю, як включити Phar.

Тепер щодо самих файлів у C: \ xampp я перейшов до папки PHP. В обох виробництва і розвитку php.ini файлів (безпечнішим , ніж шкода), у мене є allow_url_fopen=On, allow_url_include=Onі я прибрав точку з коми, так що extension=php_openssl.dllбільше не закоментований. Я навіть підтвердив, що .dll знаходиться в папці ext папки PHP. Обидва libeay32.dll і ssleay32.dll знаходяться у папках PHP та Apache. Папка Apache не містить ні продуктивних, ні файлів php.ini для розробки.

Я перейшов до http://www.slproweb.com/products/Win32OpenSSL.html і встановив Win32 OpenSSL v1.0.0d для безпечного заходу.

Тепер рядок коду, про який йдеться, у моєму retrieve_website.php виглядає так:

$urlquery = "https://www.googleapis.com/customsearch/v1?key=".$appid."&cx=".$google_searchid."&q=".$query."&alt=atom&num=".$results;
$xmlresults = file_get_contents($urlquery);

У мене є ще два веб-сайти, які я запитую, але вони обслуговуються через HTTP і вони працюють чудово. У мене також є цей рядок коду, введений наприкінці сценарію:

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);

Коли я запускаю його як сценарій PHP на Eclipse, все виходить ідеально, як я хочу разом з цими результатами:

openssl: yes
http wrapper: yes
https wrapper: yes
wrappers: array(10) {
  [0]=>
  string(5) "https"
  [1]=>
  string(4) "ftps"
  [2]=>
  string(3) "php"
  [3]=>
  string(4) "file"
  [4]=>
  string(4) "data"
  [5]=>
  string(4) "http"
  [6]=>
  string(3) "ftp"
  [7]=>
  string(13) "compress.zlib"
  [8]=>
  string(14) "compress.bzip2"
  [9]=>
  string(3) "zip"
}

Незважаючи на всі ці зміни, які я вніс (після того, як я запустив Apache), я все одно отримую ті самі помилки під час першого доступу до свого скрипту PHP в Eclipse та Firefox через http: //localhost/tutorial/retrieve_website.php :

Попередження: file_get_contents () [function.file-get-content]: Неможливо знайти обгортку "https" - ви забули включити її під час налаштування PHP? в C: \ xampp \ htdocs \ tutorial \ retrieve_website.php у рядку 29

Попередження: file_get_contents (https: // www.googleapis.com/customsearch/v1?key= видалений API ID & cx = видалений пошук ID & q = Ідентифікатор пошуку + q = The Devil + пішов + вниз + до + Джорджія & alt = atom & num = 5) [function.file-get-content]: не вдалося відкрити потік: У C: \ xampp \ htdocs \ tutorial \ retrieve_website.php у рядку 29 немає

попередження: DOMDocument :: loadXML () [domdocument.loadxml]: порожній рядок подається як вхід у C: \ xampp \ htdocs \ tutorial \ retrieve_website.php у рядку 33

openssl: немає http обгортки: так https обгортки: немає обгортки: масив (10) {[0] => рядок (3) "php" [1] => рядок (4) "файл" [2] => рядок (4) ) "glob" [3] => string (4) "data" [4] => string (4) "http" [5] => string (3) "ftp" [6] => string (3) " zip "[7] => рядок (13) "press.zlib" [8] => рядок (14) "press.bzip2 "[9] => рядок (4)" phar "}

Що це я не помітив чи не зміг зробити? Наскільки мені відомо, я зробив усе, що досліджував щодо HTTPS та OpenSSL

Відповіді:


183

Я вирішив це в XAMPP, залишивши коментар, незважаючи;extension=php_openssl.dll на /apache/bin/php.ini те, що phpinfo () сказав мені, /php/php.iniщо завантажений файл ini.

EDIT: Я думаю, що відповідь Ezra - найкраще рішення, безпосередньо додаючи рядок розширення у відповідний файл ini.


1
Ви впевнені, що його /apache/bin/php.iniя не можу знайти у портативному світлі XAMPP 1.8.1? Однак php/php.iniіснує, але включення ssl тут не допомагає :(
wine'th

1
тоді ця відповідь створить ще одну проблему, тому що openssl зараз вимкнено і призведе до помилки, якщо я get_file_contents захищеного посилання
thedjaney

5
Для мене це було xampp/php/php.ini:) спасибі, PS:
НЕ ЗАБУДУЙТЕ ЗАБУДИТИСЯ АПАРАТУ

97

Я повинен був додати extension=php_openssl.dllв мій php.iniфайл , розташований в xampp/php/php.ini. Якось його там не було, після додавання його та перезавантаження Apache все працювало нормально.


2
Мені довелося додати рядок, як це не було в php.ini - але потім зробив трюк - дякую!
Q Studio

33

просто додайте два рядки у файл php.ini.

extension=php_openssl.dll
allow_url_include = On

це працює для мене.


7
Я використовую wamp, і вам потрібно відредагувати php.ini в папці apache, а не звичайну в папці PHP: O
Al_

Дякую, саме allow_url_include = Onце вирішило для мене.
Кії

Не вмикайте enable_url_include - це робить ваш сервер уразливим.
Pascal9x

18

Ваш Apache, ймовірно, не складений із підтримкою SSL. В будь-якому разі використовуйте cURL замість file_get_contents. Спробуйте цей код, якщо він не вдається, то я маю рацію.

function curl_get_contents($url)
{
  $curl = curl_init($url);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
  $data = curl_exec($curl);
  curl_close($curl);
  return $data;
}

1
RAN , що локон функція , яку ви мені дали , і замінити $xmlresults = file_get_contents($urlquery);з $xmlresults = curl($urlquery);. PHP Script запустив його просто з тими ж результатами, що і file_get_contents (). Запускаю його як веб-сторінку PHP через localhost / tutorial / retrieve_website.php, і я отримую цю помилку:Fatal error: Call to undefined function curl_init() in C:\xampp\htdocs\tutorial\retrieve_website.php on line 14
Джон М,

1
Проблема полягає в підтримці SSL, запустіть phpinfo () і перевірте, чи є такі команди / прапори: в '--with-openssl=/usr' '--with-openssl-dir=/usr'основному вам потрібно скомпілювати Apache з підтримкою SSL, ви також повинні включити cURL, який у пару разів швидший, ніж FGC, і має численні варіанти. Я поняття не маю, як це зробити в Windows, вибачте.
Деян Марянович

1
Єдине, що близько до цього - Налаштувати команду у верхній частині phpinfo (), і це не має нічого, що містить --with-openssl. вона містить інші речі. невелике оновлення: у localhost перевіряється стан, і там написано, що активовано HTTPS (SSL).
Джон М

1
Якщо ви посилаєтесь return curl_exec($curl);, чи не завадить curl_close($curl);це виконати в наступному рядку?
Джейсон Планк

12

Я ввімкнув розширення openssl, і це працює на мене :)

; розширення = php_openssl.dll

до

extension = php_openssl.dll


6

У моєму випадку проблема сталася через те, що WAMP використовував для CLI інший php.ini, ніж Apache, тому ваші налаштування, зроблені через меню WAMP, не стосуються CLI. Просто модифікуйте CLI php.ini і воно працює.


1
Ну як ти це зробив, де я можу знайти CLI php.ini
botenvouwer

1
Тут розташована шахта:C:\path\to\wamp\bin\php\php5.3.10\php.ini
dtbarne

2
дякую за вашу відповідь, я думав, що там багато файлів php.ini. Коли я шукав, я знайшов лише один, і я прокоментував:; extension = php_openssl.dll Але я використовую xammp, я переплутав його з wamp. Тепер це працює, так!
botenvouwer

6

у OpenSuse 12.1 єдине, що потрібно було:

zypper in php5-openssl

1
Ви можете пояснити, будь ласка ??
Jason W

1
Я маю на увазі, що я отримав повідомлення про помилку "Неможливо знайти обгортку" https "- ви забули включити її під час налаштування PHP?" і вирішив це, ввівши "zypper у php5-openssl" у командному рядку. Це виправило помилку.
TheSatinKnight

5

Для мене мені довелося коментувати ці рядки в php.ini:

extension=php_openssl.dll
extension_dir = "ext"

"ext" застосовна, якщо php_openssl.dll знаходиться в папці "ext".

Примітка: я повинен був зробити це для двох моїх файлів php.ini, інакше це не буде працювати. Один розташований у папці установки vs.php, а інший у папці PHP

C:\Program Files (x86)\Jcx.Software\VS.Php\2013\Php 5.6
C:\Program Files (x86)\PHP\v5.6

Джерело


5

На MAC AMPPS я оновив php-5.5.ini з наступним і тепер він працює.

allow_url_include = On
extension=openssl.so

5

У моєму випадку (PHP 7.3 для Windows у режимі FastCGI) це не змінилося extension=openssl. Не розширення = php_ openssl , як тут публікує більшість людей.

(Те саме було розміщено тут , але без деталей про ОС, що може бути ключовою різницею тут.)



4

Проблема з file_get_contents для запитів https у Windows , скаментуйте наступні рядки у файлі php.ini:

extension=php_openssl.dll
extension_dir = "ext"

4

Ви можете скористатися цією функцією, якщо curl встановлений у вашій системі:

function get_url_contents($url){  
  if (function_exists('file_get_contents')) {  
    $result = @file_get_contents($url);  
  }  
  if ($result == '') {  
    $ch = curl_init();  
    $timeout = 30;  
    curl_setopt($ch, CURLOPT_URL, $url);  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);  
    $result = curl_exec($ch);  
    curl_close($ch);  
  }  

  return $result;  
}

2

Провівши цілий день, я зрозумів відповідь завдяки цьому посібнику: http://piwigo.org/forum/viewtopic.php?id=15727

В основному під Eclipse -> Windows -> Preferences -> PHP Executables, є розділ, на який посилаються .exe та .ini. За замовчуванням вони були в каталозі Eclipse, коли ви встановлюєте інструмент розробки програми PHP SDK з програми Eclipses Встановити нове програмне забезпечення в меню довідки.

Тож замість цього я додав новий виконуваний файл під назвою PHP 5.3.5 (CGI) та посилався на cgi.exe та .ini з папки php xampp.

Дякую webarto за те, що ви надали свій час, щоб допомогти мені.


2

Я використовую opsenSUSE Leap, і у мене була така ж проблема - це означає, що немає підтримки OpenSSL. Ось як я це вирішив:

  1. Відкрийте YaST.
  2. Перейдіть до Управління програмним забезпеченням.
  3. У полі пошуку на лівій панелі введіть 'php5-openssl' і натисніть клавішу повернення.
  4. Установіть прапорець біля пункту "php5-openssl" на правій панелі, щоб вибрати його, і натисніть "Прийняти" (Це додає підтримку OpenSSL).
  5. Перезапустити Apache: sudo service apache2 restart

Ось і все, ви закінчили.


1

Я також отримав цю помилку. Я зрозумів, що у моїй версії PHP не було зібрано openssl, тому просто додати директиву про розширення до php.ini було недостатньо. Я не знаю, як ви повинні вирішити це у вашому конкретному випадку, але для мене я використовую macports, і команда була просто:

sudo port install php5-openssl

1

Для тих, хто використовує Winginx (на основі nginx замість Apache), я виправив це за допомогою цих 4 кроків:

  1. У меню Інструменти натисніть Winginx PHP5 Config (не майте на увазі 5 в назві ...):

    Налаштування Winginx PHP5

  2. Виберіть версію PHP, для якої потрібно змінити php.ini :

    Вибір версії PHP

  3. На вкладці Розширення PHP виберіть розширення php_openssl і натисніть кнопку Зберегти :

    php_openssl вибір

  4. перезапустіть відповідну службу PHP через панель завдань ( зупинка та старт ):

    Перезапустіть сервіс PHP


1

Спробуйте це:

function curl($url){
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
    $buffer = curl_exec($curl);
    curl_close($curl);
    return $buffer;
}


2
Чим це відрізняється від цієї відповіді, яка вже є на це запитання ?
HPierce

@HPierce має 2 рядки, які спричинить синтаксичну помилку через оператора експоненції на початку та в кінці цих рядків ... Позначено для видалення.
CPHPython

@CPHPython Я думаю, що вони намагалися використовувати жирний стиль всередині кодового блоку
Нік

1
@CPHPython, Ви можете жирним кодом, але вам доведеться використовувати інший синтаксис ... Якщо ви зробите <code> <pre> звичайний код ... жирний код з * s </pre> </code>, ви отримаєте його :-). Мабуть, я не знав, що в 2016 році чи я міг би це відредагувати. Незважаючи на те, я радий бачити його видаленим.
HPierce

1
@Nick, Ви можете жирним кодом! Я не вірю, що це ніде не задокументовано. Я це зробив тут як приклад, але, думаю, це все-таки буде видалено.
HPierce

0

Якщо ви використовуєте сервер wamp, тоді перейдіть до значка, натисніть на це натисніть на іконку сервера wamp

Потім перейдіть до PHP, потім натисніть на розширення PHP, там буде потрібно php_openssl, щоб активуватись звідти та перезапустити сервер wamp активний php_openssl звідси


-1

Всередині simple_html_dom.php змініть значення $offsetзмінної з -1на 0. ця помилка зазвичай трапляється при переході на PHP 7.

HtmlDomParser::file_get_htmlвикористовує зсув за замовчуванням -1, передача даних 0повинна вирішити вашу проблему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.