Как включить обматывающие потоки HTTPS
Я установил php5 в свою систему Windows и попытался выполнить следующую script с консолью командной строки:
<?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 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" в списке, добавьте /uncomment из php.ini
extension=php_openssl.dll
Перезагрузите сервер * и сделайте.
* если сервер не перезагрузится, загрузите php_openssl.dll из какого-либо места и вставьте его в свой каталог расширений, определенный в файле php.ini, перезапустите сервер, скажите несколько адских марий и молитесь.
Ответ 2
Строка file_get_contents
в конце вашего script пытается отправить запрос HTTPS - см. URL-адрес в $req
, который начинается с 'https://ec2...'
.
Чтобы это было возможно, PHP нуждается в "обертке" для отправки HTTPS-запросов, которые, похоже, не установлены в вашей системе; что означает, что вы не можете отправлять запросы HTTPS, используя функции fopen
familly.
Для получения дополнительной информации об обтекателях потоков, если вам интересно, вы можете взглянуть на Список поддерживаемых протоколов/оберток, а в ваш случай, HTTP и 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
- вам следует пройти через эту страницу: есть много полезных опций; -)
В качестве боковой линии вы используете эту строку в начале вашего script:
$creds = parse_ini_file('/etc/aws.conf');
Путь /etc/aws.conf
кажется странным, поскольку вы сказали, что используете систему Windows: это похоже на тот путь, который будет использоваться в системе UNIX/Linux.
Ответ 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
(или, что еще важнее, для переменной extension_dir
в ini).
Ответ 4
Simple. У меня была эта ошибка, и у меня были такие головные боли. Включите (раскомментируйте строку extension=php_openssl.dll
) в файле php.ini. Это решит проблему.