J'ai installé php5 sur mon système Windows et essayé d'exécuter le script suivant avec une console de ligne de commande:
<?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;
Mais il dit qu'il est impossible de trouver le wrapper "https" et me demande si j'oublie de l'activer lorsque j'ai configuré PHP.
Quel est le problème et comment le résoudre?
1: Vérifiez quels wrappers sont installés.
<?php var_dump(stream_get_wrappers()); ?>
2: Si vous ne voyez pas "https" dans la liste, ajoutez/décommentez-vous à partir de php.ini
extension=php_openssl.dll
Redémarrez votre serveur *, et votre terminé.
* si le serveur ne parvient pas à redémarrer, allez télécharger php_openssl.dll quelque part et collez-le dans votre répertoire d'extensions défini dans le fichier php.ini, redémarrez le serveur, dites un peu, mary et faites l'amour.
La ligne file_get_contents
, à la fin de votre script, tente d'envoyer une demande HTTPS - voir l'URL dans $req
, qui commence par 'https://ec2...'
.
Pour que cela soit possible, PHP a besoin d'un "wrapper" pour envoyer des requêtes HTTPS - qui ne semblent pas être installées sur votre système. ce qui signifie que vous ne pouvez pas envoyer de requêtes HTTPS à l'aide de la famille de fonctions fopen
.
Pour plus d'informations sur les wrappers de flux, vous pouvez consulter Liste des protocoles/wrappers pris en charge et, dans votre cas, HTTP et HTTPS .
Vous devrez soit installer le wrapper HTTPs - sous Windows, je ne sais pas comment faire cela, malheureusement ...
Ou vous devrez utiliser quelque chose d'autre que file_get_contents
pour envoyer votre demande HTTPS - J'utiliserais les fonctions fournies par le curl extension (Ici aussi, je ne suis pas sûr fonctionnera "hors de la boîte", cependant :-() .
Pour un exemple, vous pouvez regarder ce qui est proposé sur la page de manuel de 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);
Notez que vous devrez probablement définir quelques options supplémentaires, en utilisant curl_setopt
- vous devriez passer par cette page: il y a beaucoup d'options utiles ;-)
En tant que note de bas de page, vous utilisez cette ligne au début de votre script:
$creds = parse_ini_file('/etc/aws.conf');
Le chemin /etc/aws.conf
semble étrange, car vous avez dit que vous utilisez un système Windows: cela ressemble au type de chemin que vous utiliseriez sur un système UNIX/Linux.
Ouvrez php.ini
. Trouvez cette ligne:
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
; ...
;extension=ext/php_oci8.dll
extension=ext/php_openssl.dll ; <---- you want this
;extension=ext/php_pdo_firebird.dll
; ...
vous souhaitez supprimer la mise en commentaire de la ligne extension=ext/php_openssl.dll
. Assurez-vous qu'il y a un fichier pho_openssl.dll
dans le répertoire ext/
, relatif à votre php.ini
(ou peut-être plus important encore à la variable extension_dir
dans l'ini).
Simple. J'ai eu cette erreur et m'a donné de tels maux de tête. Activez (décommentez la ligne extension=php_openssl.dll
) dans votre fichier php.ini. Cela résoudra le problème.