Как включить потоковые обертки HTTPS - PullRequest
16 голосов
/ 21 февраля 2010

Я установил php5 в моей системе Windows и попытался выполнить следующий скрипт с консолью командной строки:

<?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.

В чем проблема и как ее решить?

Ответы [ 4 ]

40 голосов
/ 10 марта 2010

1: проверьте, какие оболочки установлены.

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

2: Если вы не видите «https» в списке, добавьте / раскомментируйте с php.ini

extension=php_openssl.dll

Перезагрузите сервер *, и все готово.

* если сервер не может перезапуститься, скачайте php_openssl.dll из какого-то места и вставьте его в каталог расширений, определенный в файле php.ini, перезапустите сервер, произнесите несколько слов и молитесь.

10 голосов
/ 21 февраля 2010

Строка file_get_contents в конце вашего сценария пытается отправить запрос HTTPS - см. URL в $req, который начинается с 'https://ec2...'.

Чтобы это было возможно, PHP нужен «обертка» для отправки HTTPS-запросов, которая, похоже, не установлена ​​в вашей системе; это означает, что вы не можете отправлять HTTPS-запросы, используя fopen familly функций.

Для получения дополнительной информации о потоковых упаковщиках, если вам интересно, вы можете взглянуть на Список поддерживаемых протоколов / упаковщиков и, в вашем случае, HTTP и HTTPS .

Вам также придется установить обертку HTTP - в 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.

3 голосов
/ 08 января 2014

Открыть 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).

0 голосов
/ 23 июня 2014

Simple. Я имел эту ошибку и дал мне такие головные боли. Включите (раскомментируйте строку extension=php_openssl.dll) в файле php.ini. Это решит проблему.

...