Не удалось найти упаковщик «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-файл.

kjetilh
источник
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 все работало нормально.

Ezra
источник
2
Я должен был добавить строку, как это было не в php.ini - но потом сделал свое дело - спасибо!
Q Studio
33

просто добавьте две строки в ваш файл php.ini.

extension=php_openssl.dll
allow_url_include = On

это работает для меня.

Roopchand
источник
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, и это работает.

dtbarne
источник
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
TheSatinKnight
источник
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
Elye
источник
5

В моем случае (PHP 7.3 на Windows в режиме FastCGI) это было раскомментировано extension=openssl. Не расширение = php_ openssl , как большинство людей публикуют здесь.

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

1234ru
источник
4

PHP7, в файле php.ini удалите ";" передextension=openssl

Шусен Йи
источник
4

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

extension=php_openssl.dll
extension_dir = "ext"
Sandra
источник
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;  
}
actors315
источник
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

Вот и все, вы сделали.

mtchuente
источник
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

CPHPython
источник
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;
}

paprik
источник
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 отсюда

ML680
источник
-1

Внутри simple_html_dom.php измените значение $offsetпеременной с -1на 0. эта ошибка обычно происходит при переходе на PHP 7.

HtmlDomParser::file_get_htmlиспользует смещение по умолчанию -1, передача 0должна решить вашу проблему.

Tgold мозг
источник