如何启用 HTTPS 流包装器

2022-08-30 19:37:20

我在我的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时是否忘记启用它。

问题是什么,如何解决?


答案 1

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

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

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

extension=php_openssl.dll

重新启动服务器*,然后完成。

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


答案 2

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

为了实现这一点,PHP需要一个“包装器”来发送HTTPS请求 - 它似乎没有安装在你的系统上;这意味着您无法使用函数家族发送HTTPS请求。fopen

有关流包装器的更多信息,如果您感到好奇,可以查看支持的协议/包装器列表,在您的情况下,还可以查看HTTP和HTTPS

你要么必须安装HTTP包装器 - 在Windows上,我不知道该怎么做,不幸的是......


或者你必须使用其他东西来发送你的HTTPS请求 - 我会使用curl扩展提供的函数(在这里,也不确定它是否会“开箱即用”,尽管:-( ))。file_get_contents

例如,您可以查看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');

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


推荐