No se pudo encontrar el contenedor "https": ¿se olvidó de habilitarlo cuando configuró PHP?



Answers

Tuve que agregar extension=php_openssl.dll a mi archivo php.ini ubicado en xampp/php/php.ini . De alguna manera no estaba allí, después de agregarlo y reiniciar Apache todo estaba funcionando bien.

Question

El problema está en la pregunta. Hice una investigación exhaustiva de las soluciones con respecto a esto y sé que hay temas para esto y también los he seguido y nada ha funcionado. Dicho esto, enumeraré exactamente todo lo que he hecho hasta ahora. Estoy ejecutando PHP 5.2.14 con Zend Debugging en la última versión de Eclipse en mi computadora con Windows XP. Tengo 1 GB de RAM. Tengo XAMPP ejecutándose con Apache, MySQL y FileZilla instalados.

En XAMPP hice lo siguiente (Apache estaba apagado durante estos cambios): hice clic en Admin desde el Panel de control de XAMPP y fui a https:// localhost/xampp/ . A partir de ahí, acepté los certs de esta línea en la página de bienvenida:

Para la compatibilidad con OpenSSL, utilice el certificado de prueba con https: // 127.0.0.1 o https: // localhost.

En esa misma sección revisé phpinfo() . En 'Medio ambiente', SERVER["HTTPS"] está on . En 'Entorno Apache', HTTPS está On . En 'Variables de PHP, _SERVER["HTTPS"] está On . En 'Phar', la OpenSSL support está disabled (instalar ext / openssl). No sé cómo habilitar el Phar uno.

Ahora, con respecto a los archivos en C: \ xampp, fui a la carpeta PHP. Debajo de los archivos php.ini de producción y desarrollo (mejor prevenir que lamentar), tengo allow_url_fopen=On , allow_url_include=On , y allow_url_include=On el punto y coma, por lo que la extension=php_openssl.dll ya no está comentada. Incluso confirmé que el .dll está en la carpeta ext de la carpeta PHP. Tanto libeay32.dll como ssleay32.dll se encuentran en las carpetas de PHP y Apache. La carpeta Apache no contiene archivos php.ini productivos o de desarrollo.

Fui a http://www.slproweb.com/products/Win32OpenSSL.html e instalé Win32 OpenSSL v1.0.0d para una medida segura.

Ahora la línea de código en cuestión en mi retrieve_website.php se ve así:

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

Tengo otros dos sitios web que consulto pero se sirven a través de HTTP y funcionan bien. También tengo esta línea de código ingresada cerca del final del 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);

Cuando lo ejecuto como PHP Script en Eclipse, todo sale perfectamente bien de la manera que quiero junto con estos resultados:

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

A pesar de todos estos cambios que he hecho (después de haber iniciado Apache), sigo teniendo los mismos errores la primera vez que accedo a mi script PHP en Eclipse y Firefox a través de http://localhost/tutorial/retrieve_website.php :

Advertencia: file_get_contents () [function.file-get-contents]: no se puede encontrar el contenedor "https": ¿se olvidó de habilitarlo cuando configuró PHP? en C: \ xampp \ htdocs \ tutorial \ retrieve_website.php en la línea 29

Advertencia: file_get_contents (https: // www.googleapis.com/customsearch/v1?key= ID de API eliminada & cx = eliminada ID de búsqueda & q = El + Diablo + fue + abajo + a + Georgia & alt = átomo & num = 5) [archivo.función -get-contents]: no se pudo abrir la secuencia: no existe ningún archivo o directorio en C: \ xampp \ htdocs \ tutorial \ retrieve_website.php en la línea 29

Advertencia: DOMDocument :: loadXML () [domdocument.loadxml]: cadena vacía proporcionada como entrada en C: \ xampp \ htdocs \ tutorial \ retrieve_website.php en la línea 33

openssl: no http wrapper: sí https wrapper: no wrappers: array (10) {[0] => cadena (3) "php" [1] => cadena (4) "archivo" [2] => cadena (4 ) "glob" [3] => cadena (4) "datos" [4] => cadena (4) "http" [5] => cadena (3) "ftp" [6] => cadena (3) " zip "[7] => cadena (13)" compress.zlib "[8] => cadena (14)" compress.bzip2 "[9] => cadena (4)" phar "}

¿Qué es lo que he pasado por alto o no he podido hacer? Que yo sepa, he hecho todo lo que he investigado sobre HTTPS y OpenSSL




Puede usar esta función en su lugar.

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



Su Apache probablemente no está compilado con soporte SSL. Utilice cURL en lugar de file_get_contents de todos modos. Pruebe este código; si falla, entonces estoy en lo cierto.

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



En mi caso, el problema se debía a que WAMP usaba un php.ini diferente para CLI que Apache, por lo que las configuraciones realizadas a través del menú de WAMP no se aplican a CLI. Simplemente modifique el CLI php.ini y funciona.




Prueba esto:

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




En MAC AMPPS, actualicé el php-5.5.ini con lo siguiente y ahora funciona.

allow_url_include = On
extension=openssl.so



Estoy usando opsenSUSE Leap, y tuve el mismo problema: significa que no hay soporte para OpenSSL. Así es como lo resolví:

  1. Abra YaST.
  2. Vaya a Administración de software.
  3. En el cuadro de búsqueda en el panel izquierdo, ingrese 'php5-openssl' y presione la tecla de retorno.
  4. Haga clic en la casilla de verificación junto a 'php5-openssl' en el panel derecho para seleccionarlo, y haga clic en 'Aceptar' (Esto agrega compatibilidad con OpenSSL).
  5. Reinicie Apache: sudo service apache2 restart

Eso es todo, has terminado.




PHP7, en el archivo php.ini, elimine el ";" antes de la extension=openssl