Signatur
Beschreibung
Der http://- bzw. https://-Stream-Wrapper ermöglicht es, HTTP- und HTTPS-URLs direkt mit PHP-Dateifunktionen wie file_get_contents(), fopen() oder copy() anzusprechen. Voraussetzung ist, dass allow_url_fopen in der php.ini aktiviert ist.
Der Wrapper sendet intern einen HTTP-GET-Request (oder einen anderen Typ, wenn über den Stream-Kontext konfiguriert) und stellt die Antwort als lesbaren Stream bereit. Umleitungen (HTTP 3xx) werden automatisch gefolgt. Metadaten wie HTTP-Header der Antwort sind nach dem Lesen über $http_response_header oder den Stream-Kontext abrufbar.
Für komplexere Anforderungen wie POST-Daten, eigene Header, Timeouts oder Authentifizierung sollte ein Stream-Kontext via stream_context_create() übergeben werden. Für produktive Anwendungen empfiehlt sich alternativ die Verwendung der cURL-Erweiterung, die mehr Kontrolle und bessere Fehlerbehandlung bietet.
http://— unverschlüsselte HTTP-Verbindunghttps://— TLS/SSL-verschlüsselte HTTPS-Verbindung (benötigt OpenSSL-Erweiterung)
Beispiele
Einfache HTTP-GET-Anfrage mit file_get_contents
<?php
// allow_url_fopen muss in der php.ini aktiviert sein
$html = file_get_contents('http://example.com/');
if ($html !== false) {
echo 'Empfangene Bytes: ' . strlen($html) . PHP_EOL;
// HTTP-Antwort-Header stehen in $http_response_header zur Verfügung
echo $http_response_header[0] . PHP_EOL; // z. B. "HTTP/1.1 200 OK"
} else {
echo 'Abruf fehlgeschlagen.';
}
HTTP-POST-Anfrage mit Stream-Kontext
<?php
$postData = http_build_query([
'user' => 'alice',
'pass' => 'geheim',
]);
$context = stream_context_create([
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/x-www-form-urlencoded\r\n"
. "Content-Length: " . strlen($postData) . "\r\n",
'content' => $postData,
'timeout' => 10,
'ignore_errors' => true, // auch Fehler-Bodies lesen
],
]);
$response = file_get_contents('https://httpbin.org/post', false, $context);
if ($response !== false) {
$data = json_decode($response, true);
echo 'Gesendete Form-Daten: ' . print_r($data['form'] ?? [], true);
} else {
echo 'Anfrage fehlgeschlagen.';
}
HTTPS-URL mit fopen und zeilenweisem Lesen
<?php
$handle = fopen('https://example.com/', 'r');
if ($handle) {
$firstLine = fgets($handle);
fclose($handle);
echo 'Erste Zeile: ' . trim($firstLine);
} else {
echo 'Konnte URL nicht öffnen.';
}
// Wichtig · Fallstricke
Sicherheit: Das Aktivieren von allow_url_fopen kann ein Sicherheitsrisiko darstellen, wenn Benutzereingaben unkontrolliert als Dateipfade verwendet werden (Remote File Inclusion). URLs sollten stets validiert und auf erlaubte Hosts eingeschränkt werden.
SSL-Zertifikat-Prüfung: Beim Zugriff auf https://-URLs wird das Zertifikat standardmäßig geprüft. Das Deaktivieren der Prüfung ('verify_peer' => false im SSL-Kontext) ist für Produktivsysteme dringend abzuraten, da es Man-in-the-Middle-Angriffe ermöglicht.
Alternativen: Für produktive HTTP-Kommunikation wird die Verwendung von curl_exec() bzw. curl_init() empfohlen, da cURL bessere Fehlerbehandlung, mehr Optionen (Proxies, Redirects, Timeouts) und höhere Portabilität bietet. Auch HTTP-Client-Bibliotheken wie Guzzle bauen auf cURL auf.
Der Wrapper unterstützt nur lesenden Zugriff ('r'-Modus bei fopen()); schreibender Zugriff ist nicht möglich.