找不到包装器“https” - 您在配置 PHP 时是不是忘记启用它?

Posted

技术标签:

【中文标题】找不到包装器“https” - 您在配置 PHP 时是不是忘记启用它?【英文标题】:Unable to find the wrapper "https" - did you forget to enable it when you configured PHP?找不到包装器“https” - 您在配置 PHP 时是否忘记启用它? 【发布时间】:2011-07-23 14:07:58 【问题描述】:

问题在于问题。我已经对这方面的解决方案进行了彻底的调查,我知道有一些主题,我也关注了它们,但没有任何效果。话虽如此,我将准确列出我迄今为止所做的一切。我在我的 Windows XP 计算机上的最新 Eclipse 版本上运行 php 5.2.14 和 Zend 调试。我有 1 GB 的 RAM。我安装了运行 Apache、mysql 和 FileZilla 的 XAMPP。

在 XAMPP 上,我完成了以下操作(Apache 在这些更改期间关闭): 从 XAMPP 控制面板单击 Admin 并转到 https:// localhost/xampp/。从那里我接受了欢迎页面上这一行的证书:

对于 OpenSSL 支持,请使用带有 https://127.0.0.1 或 https://localhost 的测试证书。

在同一部分我检查了phpinfo()。在“环境”下,SERVER["HTTPS"]on。在“Apache 环境”下,HTTPSOn。在“PHP 变量”下,_SERVER["HTTPS"]On。在“Phar”下,OpenSSL supportdisabled(安装 ext/openssl)。我不知道如何启用 Phar one。

现在关于 C:\xampp 中的文件本身,我去了 PHP 文件夹。在生产和开发的 php.ini 文件下(比抱歉更安全),我有 allow_url_fopen=Onallow_url_include=On,并且我删除了分号,因此 extension=php_openssl.dll 不再被注释掉。我什至确认 .dll 位于 PHP 文件夹的 ext 文件夹中。 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);

当我在 Eclipse 上将它作为 PHP 脚本运行时,一切都以我想要的方式完美输出以及这些结果:

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 之后),当我第一次在 Eclipse 和 Firefox 中通过 http://localhost/tutorial/retrieve_website.php 访问我的 PHP 脚本时,我仍然遇到同样的错误:

警告:file_get_contents() [function.file-get-contents]:无法找到包装器“https” - 您在配置 PHP 时是否忘记启用它?在第 29 行的 C:\xampp\htdocs\tutorial\retrieve_website.php 警告:file_get_contents(https://www.googleapis.com/customsearch/v1?key=已删除 API ID&cx=已删除搜索 ID&q=The+Devil+went+ down+to+Georgia&alt=atom&num=5) [function.file-get-contents]: 无法打开流: 第 29 行的 C:\xampp\htdocs\tutorial\retrieve_website.php 中没有这样的文件或目录 警告:DOMDocument::loadXML() [domdocument.loadxml]:在第 33 行的 C:\xampp\htdocs\tutorial\retrieve_website.php 中作为输入提供了空字符串 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 的所有研究

【问题讨论】:

【参考方案1】:

我在 XAMPP 中通过在 /apache/bin/php.ini 中取消注释 ;extension=php_openssl.dll 来解决它尽管 phpinfo() 告诉我 /php/php.ini 是加载的 ini 文件。

编辑:我猜 Ezra 的答案是最好的解决方案,直接将扩展行添加到适当的 ini 文件中。

【讨论】:

你确定是/apache/bin/php.ini,我在XAMPP Portable Light 1.8.1 中找不到吗?但是php/php.ini 存在,但在此处启用 ssl 无济于事:( 这个答案会产生另一个问题,因为 openssl 现在被禁用,如果我 get_file_contents 安全链接会抛出错误 对我来说是xampp/php/php.ini :) 谢谢,PS:保存更改后不要忘记重新启动 APACHE 没有php_openssl.dll,只有openssl.dll。【参考方案2】:

我必须将extension=php_openssl.dll 添加到位于xampp/php/php.iniphp.ini 文件中。不知何故,它不存在,在添加它并重新启动 Apache 后一切正常。

【讨论】:

我必须添加该行,因为它不在 php.ini 中 - 但后来成功了 - 谢谢! 没有php_openssl.dll,只有openssl.dll。【参考方案3】:

只需在 php.ini 文件中添加两行。

extension=php_openssl.dll
allow_url_include = On

它对我有用。

【讨论】:

我正在使用 wamp,您需要编辑 apache 文件夹中的 php.ini,而不是 PHP 文件夹中的常用文件:O 谢谢,是allow_url_include = On为我解决了这个问题。 不要启用 allow_url_include - 这会使您的服务器易受攻击。 没有php_openssl.dll,只有openssl.dll。 在版本 7 中它只是 openssl【参考方案4】:

您的 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;

【讨论】:

运行你给我的 curl 函数并用 $xmlresults = curl($urlquery); 替换 $xmlresults = file_get_contents($urlquery);。 PHP 脚本运行得很好,结果与 file_get_contents() 相同。通过localhost/tutorial/retrieve_website.php 将其作为 PHP 网页运行,我收到此错误:Fatal error: Call to undefined function curl_init() in C:\xampp\htdocs\tutorial\retrieve_website.php on line 14 问题很可能在 SSL 支持,运行 phpinfo() 并检查是否有以下命令/标志:'--with-openssl=/usr' '--with-openssl-dir=/usr',基本上你需要编译支持 SSL 的 Apache,您还应该启用比 FGC 快几倍的 cURL,并且有很多选项。我不知道如何在 Windows 上执行此操作,抱歉。 唯一接近的是 phpinfo() 顶部的配置命令,并且没有任何包含 --with-openssl 相关的内容。它包含其他 --with 东西。小更新:在 localhost 上,检查状态并显示 HTTPS (SSL) 已激活。 如果你调用return curl_exec($curl);,那不会阻止下一行的curl_close($curl); 执行吗?【参考方案5】:

我已启用 openssl 扩展,它对我有用 :)

;extension=php_openssl.dll

extension=php_openssl.dll

【讨论】:

没有php_openssl.dll,只有openssl.dll。【参考方案6】:

就我而言(Windows 上的 PHP 7.3 在 FastCGI 模式下)它取消了 extension=openssl 的注释。 不是 extension=php_openssl,因为大多数人在这里发帖。

(同样的事情是posted here,但没有关于操作系统的详细信息,这可能是这里的关键区别。)

【讨论】:

【参考方案7】:

在我的情况下,问题是由于 WAMP 为 CLI 使用的 php.ini 与 Apache 不同,因此您通过 WAMP 菜单进行的设置不适用于 CLI。只需修改 CLI php.ini 即可。

【讨论】:

你是怎么做到的,我在哪里可以找到 CLI php.ini 我的地址在这里:C:\path\to\wamp\bin\php\php5.3.10\php.ini 感谢您的回答,我以为那里有多个 php.ini 文件。当我搜索时,我只找到了一个并且我取消了注释: ;extension=php_openssl.dll 但我使用 xammp 我将它与 wamp 混淆了。现在可以了,是的!【参考方案8】:

在 OpenSuse 12.1 中,唯一需要的是:

zypper in php5-openssl

【讨论】:

你能解释一下吗?? 我的意思是我收到错误消息“无法找到包装器“https” - 您在配置 PHP 时是否忘记启用它?”并通过在命令行输入“zypper in php5-openssl”来解决它。这修复了错误。【参考方案9】:

在 MAC AMPPS 上,我用以下内容更新了 php-5.5.ini,现在它可以工作了。

allow_url_include = On
extension=openssl.so

【讨论】:

【参考方案10】:

PHP7,在php.ini文件中,去掉“;”之前extension=openssl

【讨论】:

这不足以解决问题。【参考方案11】:

尝试在 Windows 上使用 php cli 安装 composer 时出现此错误。为了解决这个问题,我只需要更改php.ini 中的扩展目录。我不得不取消注释这一行:

; On windows:
extension_dir = "ext"

然后这一切都奏效了

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
;...
extension=openssl

【讨论】:

【参考方案12】:

对我来说,我不得不在 php.ini 中取消注释这些行:

extension=php_openssl.dll
extension_dir = "ext"

如果 php_openssl.dll 位于“ext”文件夹中,则“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

Source

【讨论】:

没有php_openssl.dll,只有openssl.dll。【参考方案13】:

在 Windows 中请求 https 的 file_get_contents 存在问题,取消注释 php.ini 文件中的以下行:

extension=php_openssl.dll
extension_dir = "ext"

【讨论】:

没有php_openssl.dll,只有openssl.dll 在版本 7 中它只是 openssl【参考方案14】:

如果您的系统上安装了 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;  

【讨论】:

【参考方案15】:

在窥探了一整天之后,感谢本指南,我找到了答案: http://piwigo.org/forum/viewtopic.php?id=15727

基本上在 Eclipse -> Windows -> Preferences -> PHP Executables 下,有一节介绍 .exe 和 .ini 的引用位置。当您从帮助菜单中的 Eclipse 安装新软件中安装 PHP 开发工具 SDK 功能时,默认的位于 Eclipse 目录中。

因此,我添加了一个名为 PHP 5.3.5 (CGI) 的新可执行文件,并从 xampp 的 php 文件夹中引用了 cgi.exe 和 .ini。

感谢 webarto 抽出时间帮助我。

【讨论】:

【参考方案16】:

我正在使用 opsenSUSE Leap,我遇到了同样的问题 - 这意味着不支持 OpenSSL。我就是这样解决的:

    打开 YaST。 转到软件管理。 在左侧窗格的搜索框中,输入“php5-openssl”并按回车键。 单击右侧窗格中“php5-openssl”旁边的复选框将其选中,然后单击“接受”(这将添加 OpenSSL 支持)。 重启 Apache:sudo service apache2 restart

就是这样,你完成了。

【讨论】:

【参考方案17】:

在 Windows 上较新版本的 PHP 上,这里的大多数答案都不起作用,因为相应的配置行已更改。

对于 PHP 7.x,您需要取消注释(删除行首的 ;)以下行:

extension_dir = "ext"extension=openssl

【讨论】:

【参考方案18】:

我也遇到了这个错误。我发现我的 PHP 版本没有编译 openssl,所以简单地将扩展指令添加到 php.ini 是不够的。我不知道在你的特殊情况下你必须如何解决这个问题,但对我来说,我使用 macports,命令只是:

sudo port install php5-openssl

【讨论】:

【参考方案19】:

对于那些使用Winginx(基于 nginx 而不是基于 Apache)的用户,我通过以下 4 个步骤修复了它:

    Tools 菜单上点击 Winginx PHP5 Config(不要介意名称中的 5...):

    选择您希望 php.ini 更改的 PHP 版本:

    PHP Extensions 选项卡上选择 php_openssl 扩展并点击 保存 按钮:

    通过任务栏重启相应的PHP服务(StopStart):

【讨论】:

【参考方案20】:

如果您使用的是 wamp 服务器,请转到图标点击此

然后转到 PHP 然后点击 PHP 扩展,需要从那里激活 php_openssl 并重新启动 wamp 服务器

【讨论】:

【参考方案21】:

simple_html_dom.php 中将 $offset 变量的值从 -1 更改为 0。 当您迁移到 PHP 7 时,通常会发生此错误。

HtmlDomParser::file_get_html 使用-1 的默认偏移量,传入0 应该可以解决您的问题。

【讨论】:

以上是关于找不到包装器“https” - 您在配置 PHP 时是不是忘记启用它?的主要内容,如果未能解决你的问题,请参考以下文章

ebaySOAP 示例示例给出错误 - 无法找到包装器“https”

找不到套接字传输“tls” - 您在配置 PHP 时是不是忘记启用它

PHP在所需文件中找不到类

作曲家要求:找不到包

为啥这个 PySide2 构建找不到生成的 C++ 包装器?

postgres 外部数据包装器远程触发器找不到远程表