Nie można znaleźć opakowania „https” - zapomniałeś go włączyć podczas konfigurowania PHP?


143

Problem tkwi w pytaniu. Dokładnie zbadałem rozwiązania w tym zakresie i wiem, że są na to tematy, śledziłem je i nic nie działało. Biorąc to pod uwagę, wymienię dokładnie wszystko, co zrobiłem do tej pory. Używam PHP 5.2.14 z debugowaniem Zend na najnowszej wersji Eclipse na moim komputerze z systemem Windows XP. Mam 1 GB pamięci RAM. Mam XAMPP działający z zainstalowanymi Apache, MySQL i FileZilla.

Na XAMPP wykonałem następujące czynności (Apache był wyłączony podczas tych zmian): Kliknąłem Admin z Panelu sterowania XAMPP i przeszedłem do https:// localhost/xampp/. Stamtąd zaakceptowałem certyfikaty z tej linii na stronie powitalnej:

Aby uzyskać obsługę OpenSSL, użyj certyfikatu testowego z https: // 127.0.0.1 lub https: // localhost.

W tej samej sekcji sprawdziłem phpinfo(). W sekcji „Środowisko” SERVER["HTTPS"]jest on. W sekcji „Środowisko Apache” HTTPSjest On. W sekcji „Zmienne PHP, _SERVER["HTTPS"]jest On. W sekcji „Phar” OpenSSL supportznajduje się disabled(install ext / openssl). Nie wiem, jak włączyć Phar.

Jeśli chodzi o same pliki w C: \ xampp, przeszedłem do folderu PHP. W obydwu plików php.ini produkcji i rozwoju (lepiej dmuchać na zimne), mam allow_url_fopen=On, allow_url_include=Oni usunąłem średnik, tak że extension=php_openssl.dllnie jest już komentarzem. Potwierdziłem nawet, że plik .dll znajduje się w folderze ext folderu PHP. Zarówno libeay32.dll, jak i ssleay32.dll znajdują się w folderach PHP i Apache. Folder Apache nie zawiera produktywnych ani programistycznych plików php.ini.

Poszedłem na http://www.slproweb.com/products/Win32OpenSSL.html i zainstalowałem Win32 OpenSSL v1.0.0d dla bezpiecznego pomiaru.

Teraz wiersz kodu w moim retrieve_website.php wygląda następująco:

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

Mam dwie inne witryny internetowe, do których odpytuję, ale są one obsługiwane przez HTTP i działają dobrze. Mam też tę linię kodu wpisaną pod koniec skryptu:

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

Kiedy uruchamiam go jako skrypt PHP na Eclipse, wszystko działa idealnie tak, jak chcę, wraz z następującymi wynikami:

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"
}

Pomimo tych wszystkich zmian, które wprowadziłem (po uruchomieniu Apache), nadal pojawiają się te same błędy, gdy po raz pierwszy uzyskuję dostęp do mojego skryptu PHP w Eclipse i Firefox przez http: //localhost/tutorial/retrieve_website.php :

Ostrzeżenie: file_get_contents () [function.file-get-content]: Nie można znaleźć opakowania „https” - czy zapomniałeś go włączyć podczas konfigurowania PHP? w C: \ xampp \ htdocs \ tutorial \ retrieve_website.php on line 29

Ostrzeżenie: file_get_contents (https: // www.googleapis.com/customsearch/v1?key= usunięty identyfikator API & cx = usunięty identyfikator wyszukiwania & q = The + Devil + poszedł + w dół + do + Georgia & alt = atom & num = 5) [function.file-get-content]: nie udało się otworzyć strumienia: Brak takiego pliku lub katalogu w C: \ xampp \ htdocs \ tutorial \ retrieve_website.php w linii 29

Ostrzeżenie: DOMDocument :: loadXML () [domdocument.loadxml]: pusty ciąg znaków dostarczony jako dane wejściowe w C: \ xampp \ htdocs \ tutorial \ retrieve_website.php w linii 33

openssl: nie opakowanie http: tak opakowanie https: brak opakowania: tablica (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 "}

Co takiego przeoczyłem lub czego nie zrobiłem? O ile wiem, zrobiłem wszystko, co badałem, dotyczące HTTPS i OpenSSL

Odpowiedzi:


183

Rozwiązałem go w XAMPP przez odkomentowanie ;extension=php_openssl.dllw /apache/bin/php.ini mimo phpinfo () mówi mi, /php/php.inibył załadowany plik ini.

EDYCJA: Myślę, że odpowiedź Ezry jest najlepszym rozwiązaniem bezpośrednio dodając linię rozszerzenia do odpowiedniego pliku ini.


1
Czy jesteś pewien /apache/bin/php.ini, że nie mogę go znaleźć w XAMPP Portable Light 1.8.1? Jednak php/php.iniistnieje, ale włączenie SSL tutaj nie pomaga :(
vin'th

1
ta odpowiedź stworzyłaby kolejny problem, ponieważ openssl jest teraz wyłączona i wyświetli błąd, jeśli otrzymam zabezpieczony link
thedjaney

5
Dla mnie to było xampp/php/php.ini:) dzięki, PS: NIE ZAPOMNIJ PONOWNIE URUCHOMIĆ APACHE PO ZAPISANIU ZMIAN
jave.web

97

Musiałem dodać extension=php_openssl.dlldo mojego php.inipliku znajdującego się w xampp/php/php.ini. Jakoś go tam nie było, po dodaniu i ponownym uruchomieniu Apache wszystko działało dobrze.


2
Musiałem dodać linię, ponieważ nie było jej w php.ini - ale wtedy załatwiłem sprawę - dzięki!
Q Studio,

33

po prostu dodaj dwie linie do pliku php.ini.

extension=php_openssl.dll
allow_url_include = On

to działa dla mnie.


7
Używam wampa i musisz edytować plik php.ini w folderze apache, a nie zwykły w folderze PHP: O
Al_

Dziękuję, to allow_url_include = Onrozwiązało to dla mnie.
Kiee

Nie włączaj allow_url_include - powoduje to podatność serwera.
Pascal9x

18

Twój Apache prawdopodobnie nie jest skompilowany z obsługą SSL. Mimo wszystko użyj cURL zamiast file_get_contents. Wypróbuj ten kod, jeśli się nie powiedzie, mam rację.

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 że funkcja zwijają mi dał i zastąpione $xmlresults = file_get_contents($urlquery);z $xmlresults = curl($urlquery);. Skrypt PHP uruchomił go dobrze z tymi samymi wynikami, co file_get_contents (). Uruchamiam go jako stronę internetową PHP przez localhost / tutorial / retrieve_website.php i otrzymuję ten błąd:Fatal error: Call to undefined function curl_init() in C:\xampp\htdocs\tutorial\retrieve_website.php on line 14
John M

1
Problem tkwi w obsłudze SSL, uruchom phpinfo () i sprawdź, czy są następujące komendy / flagi: '--with-openssl=/usr' '--with-openssl-dir=/usr'w zasadzie musisz skompilować Apache z obsługą SSL, powinieneś także włączyć cURL, który jest kilka razy szybszy niż FGC i ma wiele opcji. Nie mam pojęcia, jak to zrobić w systemie Windows, przepraszam.
Dejan Marjanović

1
jedyne blisko tego jest polecenie Konfiguruj na górze phpinfo (), które nie ma nic związanego z --with-openssl. zawiera inne rzeczy - z rzeczami. mała aktualizacja: na hoście lokalnym, sprawdzony status i mówi, że HTTPS (SSL) jest aktywowany.
John M

1
Jeśli wywołasz return curl_exec($curl);, czy to nie przeszkodzi curl_close($curl);w wykonaniu następnej linii?
Jason Plank

12

Mam włączone rozszerzenie openssl i działa dla mnie :)

; rozszerzenie = php_openssl.dll

do

rozszerzenie = php_openssl.dll


6

W moim przypadku problem wynikał z tego, że WAMP używał innego php.ini dla CLI niż Apache, więc ustawienia dokonane za pomocą menu WAMP nie mają zastosowania do CLI. Po prostu zmodyfikuj CLI php.ini i działa.


1
Jak to zrobiłeś, gdzie mogę znaleźć CLI php.ini
botenvouwer

1
Kopalnia znajduje się tutaj:C:\path\to\wamp\bin\php\php5.3.10\php.ini
dtbarne

2
dzięki za odpowiedź, pomyślałem, że tam jest wiele plików php.ini. Kiedy szukałem, znalazłem tylko jeden i odkomentowałem:; extension = php_openssl.dll Ale używam xammp, pomyliłem go z wampem. Teraz to działa, tak!
botenvouwer

6

w OpenSuse 12.1 jedyną wymaganą rzeczą było:

zypper in php5-openssl

1
czy możesz wyjaśnić?
Jason W

1
Mam na myśli komunikat o błędzie „Nie można znaleźć opakowania„ https ”- zapomniałeś go włączyć podczas konfigurowania PHP?” i rozwiązałem go, wpisując „zypper w php5-openssl” w wierszu poleceń. To naprawiło błąd.
TheSatinKnight

5

Dla mnie musiałem odkomentować te linie w php.ini:

extension=php_openssl.dll
extension_dir = "ext"

„ext” ma zastosowanie, jeśli php_openssl.dll znajduje się w folderze „ext”.

Uwaga: musiałem to zrobić dla dwóch moich plików php.ini, w przeciwnym razie nie zadziała. Jeden znajduje się w folderze instalacyjnym vs.php, a drugi w folderze PHP

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

Źródło


5

Na MAC AMPPS zaktualizowałem php-5.5.ini o następujące i teraz działa.

allow_url_include = On
extension=openssl.so

5

W moim przypadku (PHP 7.3 w systemie Windows w trybie FastCGI) było to odkomentowane extension=openssl. Nie rozszerzenie = php_ openssl , jak większość ludzi publikuje tutaj.

(To samo zostało opublikowane tutaj , ale bez szczegółów na temat systemu operacyjnego, co może być tutaj kluczową różnicą).



4

Problem z file_get_contents dla żądań https w Windows , odkomentuj następujące wiersze w pliku php.ini:

extension=php_openssl.dll
extension_dir = "ext"

4

Możesz użyć tej funkcji, jeśli curl jest zainstalowany w twoim systemie:

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

Po całym dniu węszenia znalazłem odpowiedź dzięki temu przewodnikowi: http://piwigo.org/forum/viewtopic.php?id=15727

Zasadniczo w Eclipse -> Windows -> Preferencje -> Pliki wykonywalne PHP znajduje się sekcja dotycząca odwołań do plików .exe i .ini. Domyślne pliki znajdowały się w katalogu Eclipse podczas instalowania funkcji SDK narzędzi programistycznych PHP z Eclipses Zainstaluj nowe oprogramowanie w menu Pomoc.

Więc zamiast tego dodałem nowy plik wykonywalny o nazwie PHP 5.3.5 (CGI) i odwołałem się do cgi.exe i .ini z folderu php xampp.

Dziękuję webarto za poświęcenie czasu, aby mi pomóc.


2

Używam opsenSUSE Leap i miałem ten sam problem - oznacza to, że nie ma wsparcia dla OpenSSL. Oto jak to rozwiązałem:

  1. Otwórz YaST.
  2. Przejdź do zarządzania oprogramowaniem.
  3. W polu wyszukiwania w lewym okienku wpisz „php5-openssl” i naciśnij klawisz Return.
  4. Kliknij pole wyboru obok „php5-openssl” w prawym okienku, aby je zaznaczyć, i kliknij „Akceptuj” (dodaje to obsługę OpenSSL).
  5. Zrestartuj Apache: sudo service apache2 restart

To wszystko, gotowe.


1

Mam też ten błąd. Doszedłem do wniosku, że moja wersja PHP nie ma wkompilowanego openssl, więc samo dodanie dyrektywy rozszerzenia do php.ini nie wystarczyło. Nie wiem, jak musisz to rozwiązać w twoim konkretnym przypadku, ale dla mnie używam macports, a polecenie było po prostu:

sudo port install php5-openssl

1

Dla tych, którzy używają Winginx (opartego na nginx zamiast na Apache), naprawiłem to za pomocą tych 4 kroków:

  1. W menu Narzędzia kliknij Konfiguracja Winginx PHP5 (nie wspominając o 5 w nazwie ...):

    Konfiguracja Winginx PHP5

  2. Wybierz wersję PHP, którą chcesz zmienić w php.ini :

    Wybór wersji PHP

  3. Na karcie Rozszerzenia PHP wybierz rozszerzenie php_openssl i naciśnij przycisk Zapisz :

    Wybór php_openssl

  4. zrestartuj odpowiednią usługę PHP za pomocą paska zadań ( Stop and Start ):

    Uruchom ponownie usługę PHP


1

Spróbuj tego:

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
Czym to się różni od tej odpowiedzi, która już dotyczy tego pytania ?
HPierce

@HPierce ma 2 wiersze, które spowodują błąd składniowy z powodu operatora potęgowania na początku i na końcu tych wierszy ... Oflagowane do usunięcia.
CPHPython

@CPHPython Myślę, że próbowali użyć pogrubionego stylu wewnątrz bloku kodu
Nick

1
@CPHPython, Możesz pogrubić kod, ale musisz użyć innej składni ... Jeśli zrobisz <code> <pre> normalny kod ... pogrubiony kod z * </pre> </code>, otrzymasz to :-). Najwyraźniej nie wiedziałem, że w 2016 roku lub mogłem to edytować. Mimo to cieszę się, że został usunięty.
HPierce

1
@Nick, możesz pogrubiony kod! Nie wierzę, że jest to nigdzie udokumentowane. Zrobiłem to tutaj jako przykład, ale myślę, że nadal będzie to usunięte.
HPierce

0

Jeśli korzystasz z serwera wamp, przejdź do ikony kliknij to kliknij ikonę serwera wamp

Następnie przejdź do PHP i kliknij rozszerzenie PHP, tam php_openssl będzie musiał aktywować i zrestartować serwer wamp aktywny php_openssl stąd


-1

W pliku simple_html_dom.php zmień wartość $offsetzmiennej z -1na 0. ten błąd zwykle występuje podczas migracji do PHP 7.

HtmlDomParser::file_get_htmlużywa domyślnego offsetu -1, przekazanie 0powinno rozwiązać twój problem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.