Signatur
Beschreibung
HTTP-Kontextoptionen werden einem Stream-Kontext übergeben und beeinflussen, wie PHP HTTP-Anfragen über den http://- und https://-Wrapper abwickelt. Sie ermöglichen es, Methode, Header, Body, Redirects, Proxies, Timeouts und weitere Parameter einer HTTP-Anfrage zu konfigurieren, ohne eine externe Bibliothek wie cURL zu benötigen.
Ein Kontext wird mit stream_context_create() erzeugt und anschließend als letzter Parameter an Stream-Funktionen wie file_get_contents(), fopen() oder file() übergeben. Die Optionen werden unter dem Schlüssel 'http' als assoziatives Array angegeben – obwohl der Name nur http lautet, gilt dieser Kontext auch für HTTPS-Verbindungen.
Typische Anwendungsfälle sind: HTTP-POST-Anfragen mit Formulardaten, Hinzufügen von Authentifizierungs-Headern, Deaktivieren von SSL-Prüfungen in Entwicklungsumgebungen sowie das Setzen von Timeouts für externe API-Aufrufe. Für komplexere Szenarien (z. B. Cookies, Session-Management) ist cURL oft flexibler.
- method: HTTP-Methode (
GET,POST,PUT,DELETE, …) - header: Zusätzliche HTTP-Header als String oder Array
- content: Der Anfrage-Body (z. B. POST-Daten)
- user_agent: User-Agent-String; überschreibt
user_agentaus der php.ini - proxy: URL eines HTTP-Proxys
- follow_location: Redirects automatisch folgen (1 = ja, 0 = nein)
- max_redirects: Maximale Anzahl von Redirects (Standard: 20)
- timeout: Verbindungs-Timeout in Sekunden (float)
- ignore_errors: Auch bei HTTP-Fehlercodes (4xx/5xx) den Body lesen
- protocol_version: HTTP-Protokollversion (
1.0oder1.1)
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $method | string | GET | Die HTTP-Anfragemethode, z. B. 'GET', 'POST', 'PUT' oder 'DELETE'. |
| $header | string|array | Zusätzliche HTTP-Header, entweder als String (zeilengetrennt) oder als Array von Strings im Format 'Name: Wert'. |
|
| $user_agent | string | Der User-Agent-Header. Überschreibt die php.ini-Einstellung user_agent. |
|
| $content | string | Der Inhalt des Anfrage-Body, z. B. URL-kodierte POST-Daten oder JSON. | |
| $proxy | string | URL eines HTTP-Proxy-Servers, z. B. 'tcp://proxy.example.com:8080'. |
|
| $request_fulluri | bool | false | Wenn true, wird die vollständige URI in der Anfrage gesendet (für manche Proxy-Server erforderlich). |
| $follow_location | int | 1 | Steuert, ob Weiterleitungen (HTTP 301/302/…) automatisch verfolgt werden. 0 deaktiviert das Folgen. |
| $max_redirects | int | 20 | Maximale Anzahl von Weiterleitungen, die automatisch verfolgt werden. |
| $protocol_version | float | 1.1 | HTTP-Protokollversion: 1.0 oder 1.1. |
| $timeout | float | ini_get('default_socket_timeout') | Verbindungs-Timeout in Sekunden. Akzeptiert Dezimalwerte für Millisekunden-Genauigkeit. |
| $ignore_errors | bool | false | Wenn true, wird der Response-Body auch bei HTTP-Fehlercodes (4xx, 5xx) zurückgegeben, anstatt einen Fehler auszulösen. |
Rückgabewert
stream_context_create() als Ressource zurückgegeben und an Stream-Funktionen übergeben.Beispiele
Einfacher HTTP-GET-Request mit Timeout und eigenem Header
<?php
$context = stream_context_create([
'http' => [
'method' => 'GET',
'header' => [
'Accept: application/json',
'Authorization: Bearer mein-api-token',
],
'timeout' => 5.0,
],
]);
$response = file_get_contents('https://api.example.com/users', false, $context);
if ($response === false) {
echo 'Anfrage fehlgeschlagen.';
} else {
$data = json_decode($response, true);
print_r($data);
}
HTTP-POST-Request mit JSON-Body
<?php
$payload = json_encode(['name' => 'Maria', 'email' => 'maria@example.com']);
$context = stream_context_create([
'http' => [
'method' => 'POST',
'header' => [
'Content-Type: application/json',
'Content-Length: ' . strlen($payload),
],
'content' => $payload,
'timeout' => 10.0,
'ignore_errors' => true, // Auch bei 4xx/5xx Body lesen
],
]);
$response = file_get_contents('https://api.example.com/users', false, $context);
// HTTP-Statuscode aus den Response-Headern auslesen
$status = $http_response_header[0] ?? 'Unbekannt';
echo 'Status: ' . $status . PHP_EOL;
echo 'Antwort: ' . $response;
Anfrage über einen HTTP-Proxy
<?php
$context = stream_context_create([
'http' => [
'method' => 'GET',
'proxy' => 'tcp://proxy.intern.example.com:3128',
'request_fulluri' => true,
'follow_location' => 1,
'max_redirects' => 5,
],
]);
$html = file_get_contents('http://www.example.com/', false, $context);
echo mb_substr($html, 0, 200);
// Wichtig · Fallstricke
Sicherheitshinweis: Verwende niemals benutzerkontrollierte Eingaben ungeprüft als Header-Werte — HTTP-Header-Injection ist möglich. Validiere und sanitisiere alle dynamischen Werte.
SSL/TLS: Für HTTPS können zusätzlich SSL-Kontextoptionen unter dem Schlüssel 'ssl' gesetzt werden, z. B. 'verify_peer' => false. Das Deaktivieren der Zertifikatsprüfung ist jedoch nur in Entwicklungsumgebungen akzeptabel und in Produktion ein erhebliches Sicherheitsrisiko.
$http_response_header: Nach einem erfolgreichen Stream-Aufruf ist die globale Variable $http_response_header automatisch mit den HTTP-Antwort-Headern befüllt — nützlich zum Auslesen des Status-Codes.
Alternativen: Für komplexe Szenarien (Cookies, mehrere Anfragen, parallele Requests) ist die cURL-Erweiterung (curl_exec()) oder eine Bibliothek wie Guzzle besser geeignet.