2010-02-21 3 views
16

ich php5 auf meinem Windows-System installiert und versuchte, das folgende Skript mit einer Befehlszeilenkonsole auszuführen:Wie HTTPS-Stream-Wrapper ermöglichen

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

Aber es sagt, dass es die Hülle zu finden „https“ nicht in der Lage ist und fragt, ob ich vergessen habe, es zu aktivieren, wenn ich PHP konfiguriert habe.

Was ist das Problem und wie man es regelt?

+7

Vielleicht haben Sie vergessen, https bei der Konfiguration von PHP zu aktivieren? –

+3

Sorry, es ist nicht "Was ist los mit PHP", es ist "Was ist los mit meinem Skript". –

+2

Einverstanden. "Was mit PHP nicht stimmt" würde einen ganzen anderen Religionskrieg eröffnen. :) – Paul

Antwort

10

Die Zeile file_get_contents am Ende des Skripts versucht, eine HTTPS-Anfrage zu senden - siehe URL in $req, die mit 'https://ec2...' beginnt.

Damit dies möglich ist, benötigt PHP einen "Wrapper", um HTTPS-Anfragen zu senden - was anscheinend nicht auf Ihrem System installiert ist; Das bedeutet, dass Sie keine HTTPS-Anfragen mit der fopen Familie von Funktionen senden können.

Für weitere Informationen über Stream Wrapper, wenn Sie neugierig sind, können Sie einen Blick auf List of Supported Protocols/Wrappers, und in Ihrem Fall HTTP and HTTPS.

Sie werden entweder die HTTPs-Wrapper installieren - unter Windows, ich habe keine Ahnung, wie leider, dass tun ...


Oder Sie werden feststellen, dass file_get_contents etwas anderes verwenden, müssen Bitte senden Sie Ihre HTTPS-Anfrage - ich würde die Funktionen der curl Verlängerung verwenden (auch hier ist nicht sicher, ob es "out of the box" funktionieren wird, obwohl :-()

ein Beispiel Sie. Schauen Sie sich an, was auf der Manual Page von curl_exec:

vorgeschlagen wird
// 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); 

Hinweis Sie wahrscheinlich ein paar mehr Optionen zu setzen haben, curl_setopt mit - Sie durch diese Seite gehen sollte: es ;-) viele nützliche Optionen sind


Als Nebenbei bemerkt, Sie verwenden diese Zeile am Anfang des Skriptes:

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

der Weg /etc/aws.conf seltsam fühlt sich, wie Sie gesagt haben Sie ein Windows-System verwenden: dies wie die Art von Weg sieht man auf einem UNIX/Linux verwenden würde System.

+1

Ich glaube, er muss SSL-Unterstützung installieren, um das auf Windows zu bekommen –

38

1: Überprüfen Sie, welche Wrapper installiert sind.

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

2: Wenn Sie auf der Liste finden Sie unter "https" nicht, in dem/uncomment von php.ini

extension=php_openssl.dll 

Starten Sie Ihren Server *, und fertig.

* Wenn der Server nicht neu gestartet werden kann, laden Sie php_openssl.dll von einem beliebigen Ort herunter und stecken Sie ihn in das Verzeichnis der Erweiterungen in der Datei php.ini, starten Sie den Server neu, sagen Sie ein paar Marienkäfer und beten Sie.

+0

BTW: ich verabscheue Curl, bleib bei den fopen's wie file_get_contents .... fsockopen ist wie der Papa. – Drew

+2

Über die Kommandozeile: 'php -r var_dump (stream_get_wrappers());' – Costa

+0

In Bezug auf @Costa Kommentar, hüten Sie sich oft die Kommandozeile php nimmt eine andere php.ini Datei auf, die mich schon früher erwischt hat. – Drew

3

Geöffnet php.ini.Finden Sie diese Zeile:

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

Sie die extension=ext/php_openssl.dll Linie Kommentar- wollen. Stellen Sie sicher, dass sich eine pho_openssl.dll Datei im Verzeichnis ext/ befindet, relativ zu Ihrer php.ini (oder vielleicht wichtiger an der extension_dir Variable in der Ini).

0

Einfach. Ich hatte diesen Fehler und gab mir solche Kopfschmerzen. Aktivieren Sie die Zeile extension=php_openssl.dll in Ihrer php.ini-Datei. Dies wird das Problem lösen.

Verwandte Themen