2010-02-21 11 views
16

ho installato PHP5 sul mio sistema Windows e cercato di eseguire il seguente script con una console della riga di comando:Come abilitare involucri flusso 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; 

Ma si dice che è in grado di trovare l'involucro "https" e chiede se mi dimentico di abilitarlo quando ho configurato PHP.

Qual è il problema e come risolverlo?

+7

Forse hai dimenticato di abilitare https quando hai configurato PHP? –

+3

Scusa, non è "Cosa c'è di sbagliato in PHP", è "Cosa c'è di sbagliato nel mio script". –

+2

concordato. "Cosa c'è di sbagliato in PHP" aprirebbe un'intera altra guerra religiosa. :) – Paul

risposta

10

La riga file_get_contents, alla fine dello script, sta tentando di inviare una richiesta HTTPS: vedere l'URL in $req, che inizia con 'https://ec2...'.

Perché ciò sia possibile, PHP ha bisogno di un "wrapper" per inviare richieste HTTPS - che non sembra essere installato sul sistema; il che significa che non puoi inviare richieste HTTPS usando la famiglia di funzioni fopen.

Per ulteriori informazioni sui wrapper di flusso, se siete curiosi, potete dare un'occhiata a List of Supported Protocols/Wrappers e, nel vostro caso, a HTTP and HTTPS.

potrete sia necessario installare il HTTPs involucro - su Windows, non ho idea di come farlo, purtroppo ...


o dovrete utilizzare un altro che file_get_contents a inviare la richiesta HTTPS - vorrei utilizzare le funzioni fornite dal curl estensione (anche in questo caso, non sono sicuro che funzionerà "out of the box", anche se :-()

Per un esempio, si. può dare un'occhiata a ciò che viene proposto nella pagina di manuale di 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 Probabilmente dovrete impostare un altro paio di opzioni, utilizzando curl_setopt - si dovrebbe passare attraverso la pagina: ci sono un sacco di opzioni utili ;-)


Come sidenote, si utilizza questa riga, all'inizio dello script:

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

il percorso /etc/aws.conf sembra strano, come hai detto che si sta utilizzando un sistema Windows: questo sembra il tipo di percorso si potrebbe usare su un UNIX/Linux sistema.

+1

Credo che abbia bisogno di installare il supporto SSL per ottenerlo su Windows –

38

1: Verificare quali wrapper sono installati.

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

2: Se non vedi "https" nella lista, aggiungere/togliere il commento da php.ini

extension=php_openssl.dll 

Riavviare il server *, e hai fatto.

* se il server non si riavvia, scaricare php_openssl.dll da qualche parte e incollarlo nella directory delle estensioni definita nel file php.ini, riavviare il server, pronunciare un paio di mary's e pregare.

+0

btw: detesto curl, bastone con fopen come file_get_contents .... fsockopen è come il papà. – Drew

+2

Tramite la riga di comando: 'php -r var_dump (stream_get_wrappers());' – Costa

+0

Riguardo al commento di @Costa, fate attenzione al php della riga di comando che sta rilevando un file php.ini diverso, che prima mi ha sorpreso. – Drew

3

Aperto php.ini.Trova questa riga:

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

si vuole togliere il commento alla linea di extension=ext/php_openssl.dll. Assicurati che nella directory ext/ sia presente un file pho_openssl.dll, relativo al tuo php.ini (o forse più importante alla variabile extension_dir ini).

0

Semplice. Ho avuto questo errore e mi ha dato mal di testa. Abilita (decommentare la riga extension=php_openssl.dll) nel file php.ini. Questo risolverà il problema.