2010-02-21 16 views
16

he instalado php5 en mi sistema de ventanas y trató de ejecutar la siguiente secuencia de comandos con una consola de línea de comandos:Cómo habilitar envolturas de flujos HTTPS

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

Pero dice que es incapaz de encontrar el envoltorio "https" y me pregunta si me olvidé de habilitarlo cuando configuré PHP.

¿Cuál es el problema y cómo solucionarlo?

+7

Tal vez se olvidó de habilitar https cuando configuró PHP? –

+3

Lo sentimos, no es 'Lo que está mal con PHP', sino 'Lo que está mal con mi script'. –

+2

De acuerdo. "lo que está mal con PHP" abriría una guerra religiosa entera. :) – Paul

Respuesta

10

La línea file_get_contents, al final de la secuencia de comandos, está intentando enviar una solicitud HTTPS; consulte la URL en $req, que comienza por 'https://ec2...'.

Para que esto sea posible, PHP necesita un "contenedor" para enviar solicitudes HTTPS, que no parece estar instalado en su sistema; lo que significa que no puede enviar solicitudes HTTPS utilizando la familia de funciones fopen.

Para más información sobre envolturas de flujos, si usted es curioso, se puede echar un vistazo a List of Supported Protocols/Wrappers, y, en su caso, HTTP and HTTPS.

ya sea que usted tiene que instalar la envoltura HTTPS - en Windows, no tengo idea de cómo hacerlo, por desgracia ...


o tendrás que usar algo más que a file_get_contents enviar su solicitud HTTPS - me gustaría utilizar las funciones proporcionadas por el curl extensión (Aquí, también, no está seguro de que va a trabajar "fuera de la caja", aunque :-()

por ejemplo, usted. puede echar un vistazo a lo que se propone en la página de manual 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); 

Nota Es probable que tenga que ajustar un par más opciones, usando curl_setopt - usted debe ir a través de esa página: hay una gran cantidad de opciones útiles ;-)


Como anotación al margen, está utilizando esta línea al principio de la secuencia de comandos:

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

el camino /etc/aws.conf siente extraño, como usted ha dicho que está utilizando un sistema Windows: esto parece el tipo de ruta se podría usar en una UNIX/Linux sistema.

+1

Creo que necesita instalar soporte SSL para obtener eso en Windows –

38

1: Compruebe qué envoltorios están instalados.

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

2: Si usted no ve "https" en la lista, añadir a/descomentar de php.ini

extension=php_openssl.dll 

Reinicie el servidor *, y listo.

* si el servidor no se puede reiniciar vaya a descargar php_openssl.dll desde un lugar y péguelo en el directorio de extensiones definido en el archivo php.ini, reinicie el servidor, digamos unos pocos hell's mary's y ore.

+0

por cierto: detesto el rizo, me quedo con el fopen como file_get_contents .... fsockopen es como el padre. – Drew

+2

A través de la línea de comando: 'php -r var_dump (stream_get_wrappers());' – Costa

+0

En cuanto al comentario de @Costa, ten en cuenta que el PHP de la línea de comandos está recogiendo un archivo php.ini diferente, eso me ha atrapado antes. – Drew

3

Abierto php.ini.Encuentra esta línea:

;;;;;;;;;;;;;;;;;;;;;; 
; Dynamic Extensions ; 
;;;;;;;;;;;;;;;;;;;;;; 
; ... 
;extension=ext/php_oci8.dll 
extension=ext/php_openssl.dll   ; <---- you want this 
;extension=ext/php_pdo_firebird.dll 
; ... 

que desea comentar la línea extension=ext/php_openssl.dll. Asegúrese de que haya un archivo pho_openssl.dll en el directorio ext/, relativo a su php.ini (o quizás más importante a la variable extension_dir en el ini).

0

Simple. Tuve este error y me dio tantos dolores de cabeza. Habilite (elimine el comentario de la línea extension=php_openssl.dll) en su archivo php.ini. Esto resolverá el problema.