Start · Sprachen · PHP · Referenz · http://

http://

Funktion

URL-Wrapper für den Zugriff auf HTTP- und HTTPS-Ressourcen über PHP-Streams und Dateifunktionen.

Kategorie: misc

Signatur

http://

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-Verbindung
  • https:// — 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.';
}
Empfangene Bytes: 1256 HTTP/1.1 200 OK

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.';
}
Gesendete Form-Daten: Array ( [pass] => geheim [user] => alice )

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.';
}
Erste Zeile: <!doctype html>

// 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.