Не удалось найти упаковщик «https» - вы забыли включить его при настройке PHP?


144

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

На XAMPP я сделал следующее (Apache был выключен во время этих изменений): Нажмите Admin на Панели управления 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 Script на 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-contents]: не удалось найти упаковщик «https» - вы забыли включить его при настройке PHP? в C: \ xampp \ htdocs \ tutorial \ retrieve_website.php в строке 29

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

Предупреждение: DOMDocument :: loadXML () [domdocument.loadxml]: пустая строка, предоставляемая в качестве входных данных в C: \ xampp \ htdocs \ tutorial \ retrieve_website.php в строке 33

openssl: нет http-оболочки: да https-оболочка: нет оболочек: array (10) {[0] => string (3) "php" [1] => string (4) "file" [2] => string (4) ) "glob" [3] => string (4) "data" [4] => string (4) "http" [5] => string (3) "ftp" [6] => string (3) " zip "[7] => string (13)" compress.zlib "[8] => string (14)" compress.bzip2 "[9] => string (4)" phar "}

Что я упустил из виду или не смог сделать? Насколько мне известно, я сделал все, что я исследовал в отношении HTTPS и OpenSSL

Ответы:


183

Я решил это в XAMPP, раскомментировав, несмотря;extension=php_openssl.dll на то, /apache/bin/php.ini что phpinfo () сказал, что /php/php.iniэто загруженный INI-файл.

РЕДАКТИРОВАТЬ: я думаю, Ezra ответ является лучшим решением, добавив строку расширения в соответствующий INI-файл.


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

1
этот ответ создаст еще одну проблему, потому что openssl теперь отключен и выдаст ошибку, если я получу защищенную ссылку
the_jjaney

5
Для меня это было xampp/php/php.ini:) спасибо, PS: НЕ ЗАБЫВАЙТЕ ПЕРЕЗАГРУЗИТЬ APACHE ПОСЛЕ
СОХРАНЕНИЯ

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что решило это для меня.
Ки

Не включайте allow_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
Единственное, что близко к этому, это Configure Command в верхней части phpinfo (), и в нем нет ничего, связанного с --with-openssl. он содержит другие вещи. небольшое обновление: на локальном хосте проверено состояние и указано, что HTTPS (SSL) активирован.
Джон М

1
Если вы вызываете return curl_exec($curl);, разве это не помешает curl_close($curl);выполнению следующей строки?
Джейсон Планк

12

Я включил расширение openssl, и оно работает для меня :)

; Расширение = php_openssl.dll

в

расширение = php_openssl.dll


6

В моем случае проблема была из-за того, что WAMP использовал php.ini для CLI, отличный от 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
объясните пожалуйста??
Джейсон В.

1
Я имею в виду, что я получил сообщение об ошибке «Не удалось найти упаковщик« https »- вы забыли включить его при настройке PHP?» и решил ее, введя "zypper in 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 -> «Настройки» -> «Исполняемые файлы PHP» есть раздел, в котором есть ссылки на .exe и .ini. По умолчанию они находились в каталоге Eclipse, когда вы устанавливали функцию SDK средств разработки PHP из Eclipses Install New Software в меню Help.

Поэтому вместо этого я добавил новый исполняемый файл под названием 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» (не говоря уже о 5 в имени ...):

    Winginx PHP5 Config

  2. Выберите версию PHP, которую вы хотите изменить в php.ini :

    Выбор версии PHP

  3. На вкладке Расширения PHP выберите расширение php_openssl и нажмите кнопку Сохранить :

    выбор php_openssl

  4. перезапустите соответствующий сервис PHP через панель задач ( Stop и Start ):

    Перезапустите сервис 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
@ Ник, Вы можете жирный код! Я не верю, что это задокументировано. Я сделал это здесь в качестве примера, но я думаю, что это все равно будет удалено.
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.