Impossibile trovare il wrapper "https" - hai dimenticato di abilitarlo quando hai configurato PHP?


Answers

Ho dovuto aggiungere extension=php_openssl.dll al mio file php.ini situato in xampp/php/php.ini . In qualche modo non c'era, dopo averlo aggiunto e riavviato Apache, tutto andava bene.

Question

Il problema è nella domanda. Ho fatto un'indagine approfondita per le soluzioni in merito a questo e so che ci sono argomenti per questo e ho seguito anche loro e nulla ha funzionato. Detto questo, elencherò esattamente tutto ciò che ho fatto finora. Sto eseguendo PHP 5.2.14 con Zend Debugging sull'ultima versione di Eclipse sul mio computer Windows XP. Ho un 1 GB di RAM. Ho XAMPP in esecuzione con Apache, MySQL e FileZilla installati.

Su XAMPP ho fatto quanto segue (Apache era disattivato durante queste modifiche): fatto clic su Admin dal pannello di controllo XAMPP e andato su https:// localhost/xampp/ . Da lì ho accettato i certificati da questa riga nella pagina di benvenuto:

Per il supporto OpenSSL, utilizzare il certificato di prova con https: // 127.0.0.1 o https: // localhost.

Nella stessa sezione ho controllato phpinfo() . In "Ambiente", è SERVER["HTTPS"] . In "Ambiente Apache", HTTPS è HTTPS . Sotto 'Variabili PHP, _SERVER["HTTPS"] è On . Sotto 'Phar', il OpenSSL support è disabled (installa ext / openssl). Non so come abilitare il Phar.

Ora riguardo ai file stessi in C: \ xampp, sono andato alla cartella PHP. In entrambi i file php.ini di produzione e sviluppo (meglio prevenire che curare), ho allow_url_fopen=On , allow_url_include=On , e ho rimosso il punto e virgola, in modo che extension=php_openssl.dll non sia più commentato. Ho anche confermato che il file .dll si trova nella cartella ext della cartella PHP. Sia libeay32.dll che ssleay32.dll si trovano nelle cartelle PHP e Apache. La cartella Apache non contiene file php.ini di sviluppo o di sviluppo.

Sono andato a http://www.slproweb.com/products/Win32OpenSSL.html e ho installato Win32 OpenSSL v1.0.0d per sicurezza.

Ora la riga di codice in questione nel mio retrieve_website.php ha il seguente aspetto:

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

Ho altri due siti Web che interrogo ma vengono serviti via HTTP e funzionano bene. Ho anche inserito questa riga di codice vicino alla fine dello script:

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

Quando lo eseguo come script PHP su Eclipse, tutto risulta perfettamente perfetto come voglio con questi risultati:

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

Nonostante tutte queste modifiche apportate (dopo aver avviato Apache), ottengo gli stessi errori la prima volta che accedo al mio script PHP in Eclipse e Firefox tramite http://localhost/tutorial/retrieve_website.php :

Attenzione: file_get_contents () [function.file-get-contents]: Impossibile trovare il wrapper "https" - hai dimenticato di abilitarlo quando hai configurato PHP? in C: \ xampp \ htdocs \ tutorial \ retrieve_website.php sulla riga 29

Attenzione: file_get_contents (https: // www.googleapis.com/customsearch/v1?key= ID API rimosso & cx = ID ricerca rimosso & q = Il + Devil + è andato + in basso + a + Georgia e alt = atom & num = 5) [function.file -get-contents]: impossibile aprire lo stream: nessun file o directory in C: \ xampp \ htdocs \ tutorial \ retrieve_website.php sulla riga 29

Avviso: DOMDocument :: loadXML () [domdocument.loadxml]: stringa vuota fornita come input in C: \ xampp \ htdocs \ tutorial \ retrieve_website.php sulla riga 33

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

Che cosa ho trascurato o non ho fatto? Per quanto ne so, ho fatto tutto ciò che ho studiato riguardo a HTTPS e OpenSSL




Prova questo:

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




Sto usando opsenSUSE Leap e ho avuto lo stesso problema: significa che non c'è supporto per OpenSSL. Ecco come l'ho risolto:

  1. Apri YaST.
  2. Vai a Gestione software.
  3. Nella casella di ricerca nel riquadro di sinistra, inserisci "php5-openssl" e premi il tasto Invio.
  4. Fare clic sulla casella accanto a "php5-openssl" nel riquadro di destra per selezionarlo e fare clic su "Accetta" (questo aggiunge il supporto per OpenSSL).
  5. Riavvia Apache: sudo service apache2 restart

Ecco, hai finito.




Puoi invece utilizzare questa funzione.

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



Nel mio caso, il problema era dovuto al fatto che WAMP utilizzava un php.ini diverso per CLI rispetto ad Apache, quindi le impostazioni effettuate tramite il menu WAMP non si applicano alla CLI. Basta modificare il php.ini CLI e funziona.




Probabilmente il tuo Apache non è compilato con il supporto SSL. Usa cURL invece di file_get_contents comunque. Prova questo codice, se fallisce allora ho ragione.

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



Su MAC AMPPS, ho aggiornato il php-5.5.ini con quanto segue e ora funziona.

allow_url_include = On
extension=openssl.so



PHP7, nel file php.ini, rimuovi il ";" prima extension=openssl