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


143

问题出在问题上。我已经对有关此问题的解决方案进行了彻底的调查,并且我知道与此有关的主题,并且我也一直关注它们,但没有任何效果。话虽如此,我将列出我到目前为止所做的一切。我在Windows XP计算机上的最新Eclipse版本上运行带有Zend Debugging的PHP 5.2.14。我有1 GB的RAM。我在XAMPP上运行了Apache,MySQL和FileZilla。

在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。

现在,关于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之后),但是当我第一次通过http://localhost/tutorial/retrieve_website.php访问Eclipse和Firefox中的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 + go + down + to + Georgia&alt = atom&num = 5)[function.file-get-contents]:无法打开流:C:\ xampp \ htdocs \ tutorial \ retrieve_website.php中没有这样的文件或目录,第29行

警告: 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] =>字符串(4)“数据” [4] =>字符串(4)“ http” [5] =>字符串(3)“ ftp” [6] =>字符串(3)“ zip“ [7] =>字符串(13)” compress.zlib“ [8] =>字符串(14)” compress.bzip2“ [9] =>字符串(4)” phar“}

我忽略或未能完成的工作是什么?据我所知,我已经完成了有关HTTPS和OpenSSL的研究工作

Answers:


183

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

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


1
您确定/apache/bin/php.ini它在XAMPP Portable Light 1.8.1中找不到它吗?但是php/php.ini存在,但是在这里启用ssl并没有帮助:(
vine'th 2012年

1
然后,此答案将产生另一个问题,因为openssl现在已被禁用,并且如果我get_file_contents是一个安全链接,将引发错误
thedjaney

5
对我来说,这是xampp/php/php.ini:)谢谢,PS:
更改

97

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


2
我必须添加这一行,因为它不在php.ini中-但后来成功了-谢谢!
Q Studio

33

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

extension=php_openssl.dll
allow_url_include = On

它为我工作。


7
我使用的是wamp,您需要在apache文件夹中编辑php.ini,而不是在PHP文件夹中编辑通常的文件夹:O
Al_13 2013年

谢谢,这是allow_url_include = On为我解决的。
Kiee

不要启用allow_url_include-这会使您的服务器容易受到攻击。
Pascal9x

18

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

1
运行了你给我的curl函数,替换$xmlresults = file_get_contents($urlquery);$xmlresults = curl($urlquery);。PHP Script运行得很好,结果与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
John M

1
问题在于SSL支持的问题,请运行phpinfo()并检查是否存在以下命令/标志:'--with-openssl=/usr' '--with-openssl-dir=/usr'基本上,您需要使用SSL支持来编译Apache,还应该启用比FGC快几倍的cURL,并且具有许多选项。抱歉,我不知道如何在Windows上执行此操作。
DejanMarjanović

1
唯一接近的是phpinfo()顶部的Configure Command,并且没有包含--with-openssl相关内容。它包含其他的东西。小更新:在localhost上,检查状态,并说HTTPS(SSL)已激活。
John M

1
如果调用return curl_exec($curl);,那是否会阻止curl_close($curl);下一行的执行?
詹森·普兰克


6

就我而言,问题是由于WAMP针对CLI使用的Apache不同于Apache的php.ini,因此您通过WAMP菜单进行的设置不适用于CLI。只需修改CLI php.ini即可。


1
请问您是如何做到的,在哪里可以找到CLI php.ini
botenvouwer 2013年

1
矿山位于这里:C:\path\to\wamp\bin\php\php5.3.10\php.ini
dtbarne

2
感谢您的回答,我认为那里有多个php.ini文件。当我搜索时,我只找到一个,并且没有注释:; extension = php_openssl.dll但我使用xammp,我将其与wamp混淆了。现在可以了,是的!
botenvouwer

6

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

zypper in php5-openssl

1
你能解释一下吗?
杰森W

1
我的意思是我收到错误消息“无法找到包装器“ https”-在配置PHP时您是否忘记启用它?” 并通过在命令行输入“ php5-openssl中的zypper”来解决。修复了错误。
TheSatinKnight 2014年

5

对我来说,我必须在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

资源


5

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

allow_url_include = On
extension=openssl.so

5

就我而言(在Windows上,在FastCGI模式下为PHP 7.3),它没有注释extension=openssl。并非大多数人在此处发布的extension = php_ openssl

此处发布了相同的内容,但是没有关于操作系统的详细信息,这可能是此处的主要区别。)


4

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


4

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

extension=php_openssl.dll
extension_dir = "ext"

4

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

2

经过一整天的侦探,我通过此指南找到了答案:http : //piwigo.org/forum/viewtopic.php?id=15727

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

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

谢谢webarto给您的时间来帮助我。


2

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

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

就是这样,您完成了。


1

我也收到这个错误。我发现我的PHP版本没有编译opensl,因此仅将扩展指令添加到php.ini中是不够的。我不知道您如何在特定情况下解决此问题,但是对我来说,我使用macports,命令仅为:

sudo port install php5-openssl

1

对于使用Winginx(基于nginx而非基于Apache)的用户,我通过以下4个步骤对其进行了修复:

  1. 在“ 工具”菜单上,单击“ Winginx PHP5 Config”(不要介意名称中的5 ...):

    Winginx PHP5配置

  2. 选择要更改php.ini的PHP版本:

    PHP版本选择

  3. 在“ PHP扩展”选项卡上,选择php_openssl扩展,然后单击“ 保存”按钮:

    php_openssl选择

  4. 通过任务栏重新启动适当的PHP服务(StopStart):

    重新启动PHP服务


1

试试这个:

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


2
这与已经在此问题上的答案 有何不同?
HPierce '16

@HPierce它有2行,由于这些行的开头和结尾处的幂运算符,将导致语法错误...标记为删除。
CPHPython

@CPHPython我认为他们尝试在代码块内使用粗体样式
Nick

1
@CPHPython,您可以加粗代码,但是必须使用不同的语法...如果您执行<code> <pre>普通代码... 用*的</ pre> </ code> 粗体代码,则会得到它:-)。显然我不知道在2016年,或者我可能对此进行了编辑。无论如何,我很高兴看到它被删除。
HPierce

1
@Nick,您可以加粗代码!我不相信任何地方都有记录。我以此处为例进行了说明,但我认为仍将删除它。
HPierce '18

0

如果您使用的是Wamp Server,请转到图标,单击此 湿服务器图标单击此

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


-1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.