21

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 を構成したときにラッパーを有効にするのを忘れていないかどうか尋ねられます。

何が問題で、どのように解決するのですか?

4

4 に答える 4

43

1: インストールされているラッパーを確認します。

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

2: リストに「https」が表示されない場合は、php.ini に追加/コメント解除します

extension=php_openssl.dll

サーバーを再起動*して完了です。

*サーバーの再起動に失敗した場合は、どこかから php_openssl.dll をダウンロードし、php.ini ファイルで定義されている拡張機能のディレクトリに貼り付けて、サーバーを再起動し、数回の地獄のメアリーと言って祈ってください。

于 2010-03-10T12:27:03.483 に答える
10

スクリプトの最後のfile_get_contents行は、HTTPS 要求を送信しようとしています。$reqで始まるの URL を参照してください'https://ec2...'

これを可能にするには、PHP に HTTPS リクエストを送信するための「ラッパー」が必要です。これはシステムにインストールされていないようです。fopenつまり、一連の関数を使用して HTTPS リクエストを送信することはできません。

ストリーム ラッパーの詳細については、興味がある場合はList of Supported Protocols/Wrappersを参照してください。この場合は、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してください -- そのページを通過する必要があります。多くの便利なオプションがあります;-)


補足として、スクリプトの先頭で次の行を使用しています。

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

/etc/aws.confあなたがWindowsシステムを使用しているとあなたが言ったように、パスは奇妙に感じます.これは、UNIX/Linuxシステムで使用するようなパスのように見えます.

于 2010-02-21T13:15:55.650 に答える
4

開く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.dllpho_openssl.dllディレクトリにファイルがあることを確認してください。これは、ext/あなたのディレクトリphp.ini(または、もっと重要なことextension_dirに、ini 内の変数) に関連しています。

于 2014-01-08T16:44:12.250 に答える
0

単純。このエラーが発生し、頭痛の種になりました。extension=php_openssl.dllphp.ini ファイルで有効にします(行のコメントを外します)。これで問題は解決します。

于 2014-06-23T07:45:14.467 に答える