找不到包装器“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 环境”下,HTTPS
是On
。在“PHP 变量”下,_SERVER["HTTPS"]
是 On
。在“Phar”下,OpenSSL support
是 disabled
(安装 ext/openssl)。我不知道如何启用 Phar one。
现在关于 C:\xampp 中的文件本身,我去了 PHP 文件夹。在生产和开发的 php.ini 文件下(比抱歉更安全),我有 allow_url_fopen=On
、allow_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.ini
的php.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服务(Stop和Start):
【讨论】:
【参考方案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 时是不是忘记启用它