【问题标题】:How to enable HTTPS stream wrappers如何启用 HTTPS 流包装器
【发布时间】:2011-01-19 08:12:53
【问题描述】:

我在我的 windows 系统上安装了 php5,并尝试使用命令行控制台执行以下脚本:

<?php
// load in credentials
$creds = parse_ini_file('/etc/aws.conf');

// Define query string keys/values
$params = array(
    'Action' => 'DescribeAvailabilityZones',
    'AWSAccessKeyId' => $creds['access_key'],
    'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'),
    'Version' => '2008-05-05',
    'ZoneName.0' => 'us-east-1a',
    'ZoneName.1' => 'us-east-1b',
    'ZoneName.2' => 'us-east-1c',
    'SignatureVersion' => 2,
    'SignatureMethod' => 'HmacSHA256'
);

// See docs
// http://tr.im/jbjd
uksort($params, 'strnatcmp');
$qstr = '';
foreach ($params as $key => $val) {
    $qstr .= "&{$key}=".rawurlencode($val);
}
$qstr = substr($qstr, 1);

// Signature Version 2
$str = "GET\n"
     . "ec2.amazonaws.com\n"
     . "/\n"
     . $qstr;

// Generate base64-encoded RFC 2104-compliant HMAC-SHA256
// signature with Secret Key using PHP 5's native 
// hash_hmac function.
$params['Signature'] = base64_encode(
    hash_hmac('sha256', $str, $creds['secret_key'], true)
);

// simple GET request to EC2 Query API with regular URL 
// encoded query string
$req = 'https://ec2.amazonaws.com/?' . http_build_query(
    $params
);
$result = file_get_contents($req);

// do something with the XML response
echo $result;

但它说它无法找到包装器“https”并询问我是否在配置 PHP 时忘记启用它。

问题是什么,如何解决?

【问题讨论】:

  • 可能是你配置PHP的时候忘记开启https了?
  • 抱歉,不是“PHP 出了什么问题”,而是“我的脚本出了什么问题”。
  • 同意。 “PHP 出了什么问题”会引发另一场宗教战争。 :)

标签: php amazon


【解决方案1】:

1:检查安装了哪些包装器。

<?php var_dump(stream_get_wrappers()); ?>

2:如果您在列表中没有看到“https”,请在 php.ini 中添加/取消注释

extension=php_openssl.dll

重启你的服务器*,你就完成了。

*如果服务器无法重新启动,请从某个地方下载 php_openssl.dll 并将其粘贴到 php.ini 文件中定义的扩展目录中,重新启动服务器,说几句地狱玛丽并祈祷。

【讨论】:

  • 顺便说一句:我讨厌 curl,坚持使用 fopen 之类的 file_get_contents.... fsockopen 就像爸爸一样。
  • 关于@Costa 评论,请注意命令行 php 经常会选择一个不同的 php.ini 文件,这让我很困惑。
  • 是的,这就是我提到它的原因。 :) 如果您需要检查命令行可以使用哪些流,那就是要使用的命令(我遇到了您描述的情况)。
  • 别忘了在 `php.ini' 中取消注释 extension_dir
  • 我发现它是;extension=openssl(删除分号以取消注释。)
【解决方案2】:

脚本末尾的 file_get_contents 行正在尝试发送 HTTPS 请求 - 请参阅 $req 中的 URL,该 URL 以 'https://ec2...' 开头。

为此,PHP 需要一个“包装器”来发送 HTTPS 请求——您的系统上似乎没有安装它;这意味着您无法使用 fopen 函数系列发送 HTTPS 请求。

有关流包装器的更多信息,如果您好奇,可以查看List of Supported Protocols/Wrappers,在您的情况下,可以查看HTTP and HTTPS

您要么必须安装 HTTPS 包装器——在 Windows 上,我不知道该怎么做,很遗憾...


或者您将不得不使用 file_get_contents 的其他东西来发送您的 HTTPS 请求——我将使用 curl 扩展提供的功能 (在这里,也不确定它是否可以“开箱即用” ”,不过 :-( ).

例如,您可以查看curl_exec 的手册页上的建议:

// create a new cURL resource
$ch = curl_init();

// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);

// grab URL and pass it to the browser
curl_exec($ch);

// close cURL resource, and free up system resources
curl_close($ch);

请注意,您可能需要使用curl_setopt 设置更多选项——您应该浏览该页面:有很多有用的选项;-)


作为旁注,您在脚本的开头使用了这一行:

$creds = parse_ini_file('/etc/aws.conf');

/etc/aws.conf 的路径感觉很奇怪,因为你说你使用的是 Windows 系统:这看起来像是在 UNIX/Linux 系统上使用的那种路径。

【讨论】:

  • 我相信他需要安装 SSL 支持才能在 Windows 上获得该支持
【解决方案3】:

打开php.ini。找到这一行:

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
; ...
;extension=ext/php_oci8.dll
extension=ext/php_openssl.dll         ; <---- you want this
;extension=ext/php_pdo_firebird.dll
; ...

您想取消注释 extension=ext/php_openssl.dll 行。确保ext/ 目录中有一个pho_openssl.dll 文件,相对于您的php.ini(或者可能更重要的是相对于ini 中的extension_dir 变量)。

【讨论】:

    【解决方案4】:

    简单。我有这个错误,让我很头疼。在 php.ini 文件中启用(取消注释 extension=php_openssl.dll 行)。这将解决问题。

    【讨论】:

      猜你喜欢
      • 2012-09-05
      • 2012-05-06
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多