Não foi possível encontrar o wrapper "https" - você esqueceu de ativá-lo quando configurou o PHP?

143

O problema está na questão. Fiz uma investigação minuciosa de soluções em relação a isso e sei que existem tópicos para isso e também os segui e nada funcionou. Dito isto, vou listar exatamente tudo o que fiz até agora. Estou executando o PHP 5.2.14 com Zend Debugging na versão mais recente do Eclipse no meu computador com Windows XP. Eu tenho 1 GB de RAM. Eu tenho o XAMPP em execução com o Apache, MySQL e FileZilla instalados.

No XAMPP, eu fiz o seguinte (o Apache estava desativado durante essas alterações): Clique em Admin no Painel de controle do XAMPP e vá para https:// localhost/xampp/. A partir daí, aceitei os materiais desta linha na página de boas-vindas:

Para suporte ao OpenSSL, use o certificado de teste com https: // 127.0.0.1 ou https: // localhost.

Na mesma seção, verifiquei phpinfo(). Em 'Ambiente', SERVER["HTTPS"]é on. Em 'Ambiente Apache', HTTPSé On. Em 'Variáveis ​​PHP, _SERVER["HTTPS"]é On. Em 'Phar', OpenSSL supporté disabled(instale ext / openssl). Não sei como habilitar o Phar.

Agora, com relação aos arquivos em C: \ xampp, fui para a pasta PHP. Em ambos os arquivos php.ini produção e desenvolvimento (melhor prevenir do que remediar), eu tenho allow_url_fopen=On, allow_url_include=One eu removi o ponto e vírgula, de modo que extension=php_openssl.dllnão é mais comentada. Eu até confirmei que o .dll está na pasta ext da pasta PHP. O libeay32.dll e o ssleay32.dll estão nas pastas PHP e Apache. A pasta Apache não contém arquivos php.ini produtivos ou em desenvolvimento.

Eu fui a http://www.slproweb.com/products/Win32OpenSSL.html e instalei o Win32 OpenSSL v1.0.0d para uma medida segura.

Agora, a linha de código em questão no meu retrieve_website.php fica assim:

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

Eu tenho dois outros sites que eu consulta, mas eles são servidos via HTTP e funcionam bem. Eu também tenho essa linha de código inserida perto do final do 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 eu o executo como um script PHP no Eclipse, tudo sai perfeitamente bem do jeito que eu quero, juntamente com estes 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"
}

Apesar de todas essas alterações que fiz (depois de iniciar o Apache), ainda recebo os mesmos erros na primeira vez em que acesso meu script PHP no Eclipse e Firefox via http: //localhost/tutorial/retrieve_website.php :

Aviso: file_get_contents () [function.file-get-contents]: Não foi possível encontrar o wrapper "https" - você esqueceu de ativá-lo quando configurou o PHP? em C: \ xampp \ htdocs \ tutorial \ retrieve_website.php na linha 29

Aviso: file_get_contents (https: // www.googleapis.com/customsearch/v1?key= ID da API removida & cx = ID da pesquisa removida & q = The + Devil + foi + descer + para + Geórgia & alt = atom & num = 5) [function.file-get-contents]: falha ao abrir o fluxo: Não existe esse arquivo ou diretório em C: \ xampp \ htdocs \ tutorial \ retrieve_website.php na linha 29

Aviso: DOMDocument :: loadXML () [domdocument.loadxml]: string vazia fornecida como entrada em C: \ xampp \ htdocs \ tutorial \ retrieve_website.php na linha 33

openssl: não http wrapper: sim https wrapper: não wrappers: matriz (10) {[0] => string (3) "php" [1] => string (4) "file" [2] => string (4 ) "glob" [3] => sequência (4) "dados" [4] => sequência (4) "http" [5] => sequência (3) "ftp" [6] => sequência (3) " zip "[7] => string (13)" compress.zlib "[8] => string (14)" compress.bzip2 "[9] => string (4)" phar "}

O que ignorei ou deixei de fazer? Que eu saiba, eu fiz tudo o que pesquisei sobre HTTPS e OpenSSL

John M
fonte

Respostas:

183

Eu o resolvi no XAMPP, removendo o comentário ;extension=php_openssl.dll, /apache/bin/php.ini apesar do phpinfo () ter me dito que /php/php.iniera o arquivo ini carregado.

EDIT: Eu acho que a resposta Ezra é a melhor solução para adicionar diretamente a linha de extensão ao arquivo ini apropriado.

kjetilh
fonte
1
Você tem certeza de que /apache/bin/php.ininão é possível encontrá-lo no XAMPP Portable Light 1.8.1? No entanto php/php.ini, existe, mas ativar o ssl aqui não ajuda :(
vine'th 12/12/12
1
esta resposta, então, criar um outro problema, porque openssl agora está desativado e irá lançar um erro se eu get_file_contents uma ligação segura
thedjaney
5
Para mim foi xampp/php/php.ini:) Obrigado, PS: não esqueça de reiniciar o apache Depois de salvar MUDANÇAS
jave.web
97

Eu tive que adicionar extension=php_openssl.dllao meu php.iniarquivo localizado em xampp/php/php.ini. De alguma forma, não estava lá, depois de adicioná-lo e reiniciar o Apache tudo estava funcionando bem.

Esdras
fonte
2
Eu tive que adicionar a linha, pois ela não estava no php.ini - mas depois fez o truque - obrigado!
Q Studio
33

basta adicionar duas linhas no seu arquivo php.ini.

extension=php_openssl.dll
allow_url_include = On

está funcionando para mim.

Roopchand
fonte
7
Estou usando o wamp e você precisa editar o php.ini na pasta apache, e o habitual na pasta PHP: O
Al_
Obrigado, foi o allow_url_include = Onque resolveu para mim.
Kiee
Não ative allow_url_include - isso torna seu servidor vulnerável.
Pascal9x
18

Seu Apache provavelmente não foi compilado com suporte a SSL. Use cURL em vez de file_get_contents de qualquer maneira. Experimente este código, se falhar, então estou certo.

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;
}
Dejan Marjanović
fonte
1
executou a função de ondulação que você me deu e substituiu $xmlresults = file_get_contents($urlquery);por $xmlresults = curl($urlquery);. O script PHP funcionou perfeitamente com os mesmos resultados que file_get_contents (). Executando-o como página da Web PHP via localhost / tutorial / retrieve_website.php e eu recebo este erro: #:Fatal error: Call to undefined function curl_init() in C:\xampp\htdocs\tutorial\retrieve_website.php on line 14
John M
1
O problema é provavelmente no suporte a SSL, execute phpinfo () e verifique se existem os seguintes comandos / sinalizadores: '--with-openssl=/usr' '--with-openssl-dir=/usr'basicamente, você precisa compilar o Apache com suporte a SSL, também deve habilitar o cURL duas vezes mais rápido que o FGC e possui várias opções. Não tenho idéia de como fazer isso no Windows, desculpe.
Dejan Marjanović 26/03
1
A única coisa perto disso é o comando Configure no topo do phpinfo () e que não tem nada que contenha --with-openssl. contém outros - com coisas. pequena atualização: no host local, status verificado e diz que HTTPS (SSL) está ativado.
John M
1
Se você invocar return curl_exec($curl);, isso não impediria curl_close($curl);a execução da próxima linha?
27611 Jason Plank
12

Eu ativei a extensão openssl e funcionou para mim :)

; extension = php_openssl.dll

para

extension = php_openssl.dll

Saran Pal
fonte
6

No meu caso, o problema ocorreu devido ao WAMP usar um php.ini para CLI diferente do Apache, portanto, suas configurações feitas através do menu WAMP não se aplicam ao CLI. Basta modificar o CLI php.ini e ele funciona.

dtbarne
fonte
1
Wel como é que você fez isso, onde eu posso encontrar o php.ini CLI
botenvouwer
1
O meu está localizado aqui:C:\path\to\wamp\bin\php\php5.3.10\php.ini
dtbarne
2
obrigado pela sua resposta, eu pensei que havia vários arquivos php.ini. Quando pesquisei, encontrei apenas um e descomentei:; extension = php_openssl.dll Mas como uso o xammp, confundi-o com o wamp. Agora funciona, sim!
botenvouwer
6

no OpenSuse 12.1, a única coisa necessária era:

zypper in php5-openssl
TheSatinKnight
fonte
1
você pode explicar por favor ??
Jason W
1
Quero dizer, recebi a mensagem de erro "Não foi possível encontrar o wrapper" https "- você esqueceu de ativá-lo quando configurou o PHP?" e o resolvi digitando "zypper no php5-openssl" na linha de comando. Isso corrigiu o erro.
TheSatinKnight
5

Para mim, tive que descomentar essas linhas no php.ini:

extension=php_openssl.dll
extension_dir = "ext"

"ext" é aplicável se php_openssl.dll estiver localizado na pasta "ext".

Nota: Eu tive que fazer isso para dois dos meus arquivos php.ini, caso contrário não funcionaria. Um localizado na pasta de instalação vs.php e o outro na pasta PHP

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

Fonte

zeta
fonte
5

No MAC AMPPS, atualizei o php-5.5.ini com o seguinte e agora ele funciona.

allow_url_include = On
extension=openssl.so
Elye
fonte
5

No meu caso (PHP 7.3 no Windows no modo FastCGI), isso foi descomentador extension=openssl. Não extension = php_ openssl , como a maioria das pessoas publica aqui.

(A mesma coisa foi publicada aqui , mas sem detalhes no SO, o que pode ser uma diferença importante aqui.)

1234ru
fonte
4

PHP7, no arquivo php.ini, remova o ";" antesextension=openssl

Shusen Yi
fonte
4

Problema com file_get_contents para as solicitações https no Windows , remova o comentário das seguintes linhas no arquivo php.ini:

extension=php_openssl.dll
extension_dir = "ext"
Sandra
fonte
4

Você pode usar esta função se o curl estiver instalado no seu sistema:

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;  
}
atores315
fonte
2

Depois de bisbilhotar o dia inteiro, descobri a resposta graças a este guia: http://piwigo.org/forum/viewtopic.php?id=15727

Basicamente, em Eclipse -> Windows -> Preferências -> Executáveis ​​PHP, há uma seção na qual os arquivos .exe e .ini são referenciados. Os padrões estavam no diretório Eclipse quando você instala o Recurso SDK das Ferramentas de Desenvolvimento PHP a partir dos Eclipses Instalar Novo Software no menu Ajuda.

Então, em vez disso, adicionei um novo executável chamado PHP 5.3.5 (CGI) e referenciei o cgi.exe e .ini da pasta php do xampp.

Obrigado webarto por dedicar seu tempo para me ajudar.

John M
fonte
2

Estou usando o opsenSUSE Leap e tive o mesmo problema - significa que não há suporte para o OpenSSL. Foi assim que eu resolvi:

  1. Abra o YaST.
  2. Vá para Gerenciamento de software.
  3. Na caixa de pesquisa no painel esquerdo, digite 'php5-openssl' e pressione a tecla Enter.
  4. Clique na caixa de seleção ao lado de 'php5-openssl' no painel direito para selecioná-lo e clique em 'Aceitar' (isso adiciona suporte ao OpenSSL).
  5. Reinicie o Apache: sudo service apache2 restart

É isso aí, você terminou.

mtchuente
fonte
1

Também recebi esse erro. Eu descobri que minha versão do PHP não tinha o openssl compilado, então simplesmente adicionar a diretiva de extensão ao php.ini não era suficiente. Eu não sei como você deve resolver isso no seu caso específico, mas para mim eu uso macports, e o comando foi apenas:

sudo port install php5-openssl
pedreiro
fonte
1

Para aqueles que usam o Winginx (baseado no nginx em vez do Apache), eu o corrigi com estas 4 etapas:

  1. No menu Ferramentas, pressione o Winginx PHP5 Config (não importa os 5 no nome ...):

    Winginx PHP5 Config

  2. Selecione a versão do PHP que você deseja que o php.ini altere:

    Seleção de versão do PHP

  3. Na guia Extensões do PHP, selecione a extensão php_openssl e pressione o botão Salvar :

    seleção php_openssl

  4. reinicie o serviço PHP apropriado através da barra de tarefas ( Parar e Iniciar ):

    Reinicie o serviço PHP

CPHPython
fonte
1

Tente o seguinte:

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

páprica
fonte
2
Como isso é diferente desta resposta que já está nesta pergunta ?
HPierce
@HPierce possui 2 linhas que causarão um erro de sintaxe devido ao operador de exponenciação no início e no final dessas linhas ... Sinalizado para exclusão.
precisa saber é o seguinte
@CPHPython Eu acho que eles tentaram usar o negrito estilo dentro de um bloco de código
Nick
1
@CPHPython, você pode usar o código em negrito, mas precisa usar uma sintaxe diferente ... Se você fizer um <code> <pre> código normal ... o código em negrito com * 's </pre> </code>, é possível obtê-lo :-). Aparentemente, eu não sabia disso em 2016 ou eu poderia ter editado isso. Independentemente disso, fico feliz em vê-lo excluído.
precisa saber é o seguinte
1
@ Nick, você pode negrito código! Não acredito que esteja documentado em nenhum lugar. Fiz isso aqui como exemplo, mas acho que isso ainda será excluído.
precisa saber é o seguinte
0

Se você estiver usando o servidor wamp, vá para o ícone, clique neste ícone do servidor wamp clique neste

Em seguida, vá para o PHP e clique na extensão PHP. Php_openssl precisará ativar a partir daí e reiniciar o servidor wamp php_openssl ativo a partir daqui

ML680
fonte
-1

Dentro do simple_html_dom.php altere o valor da $offsetvariável de -1para 0. esse erro geralmente ocorre quando você migra para o PHP 7.

HtmlDomParser::file_get_htmlusa um deslocamento padrão de -1, a passagem 0deve resolver seu problema.

Tgold brain
fonte