Start · Sprachen · PHP · Referenz · libxml_set_streams_context

libxml_set_streams_context

Funktion

Setzt den PHP-Stream-Kontext, der beim nächsten Laden oder Schreiben eines libxml-Dokuments verwendet wird.

seit PHP 5.0.0 Kategorie: xml

Signatur

libxml_set_streams_context(resource $context): void

Beschreibung

libxml_set_streams_context() ermöglicht es, einen benutzerdefinierten PHP-Stream-Kontext (erstellt mit stream_context_create()) für libxml-Operationen zu hinterlegen. Dieser Kontext wird dann beim nächsten Zugriff auf externe Ressourcen – etwa beim Laden von XML- oder HTML-Dokumenten über URLs – automatisch verwendet.

Der typische Anwendungsfall ist das Laden von XML-Dokumenten über HTTP, wenn dabei spezielle HTTP-Header, Proxy-Einstellungen, SSL-Optionen oder Authentifizierungsdaten benötigt werden. Ohne diesen Mechanismus hätte man keine Möglichkeit, das Netzwerkverhalten von Klassen wie DOMDocument oder SimpleXML zu steuern.

Der gesetzte Kontext gilt einmalig für den nächsten libxml-Lese- oder Schreibvorgang. Es empfiehlt sich daher, libxml_set_streams_context() direkt vor dem jeweiligen Ladeaufruf (z. B. DOMDocument::load() oder simplexml_load_file()) aufzurufen.

Hinweis: Diese Funktion beeinflusst nur Operationen, die intern libxml nutzen, also beispielsweise DOMDocument, SimpleXMLElement und ähnliche. Eigene Stream-Operationen mit fopen() oder file_get_contents() werden davon nicht beeinflusst.

Parameter

Name Typ Default Beschreibung
$context Pflicht resource Ein gültiger Stream-Kontext, wie er von stream_context_create() zurückgegeben wird. Dieser Kontext enthält Optionen für HTTP, FTP, SSL oder andere Stream-Wrapper.

Rückgabewert

Typ
void
Beschreibung
Diese Funktion gibt keinen Wert zurück.

Beispiele

XML-Dokument per HTTP mit benutzerdefiniertem User-Agent laden

<?php
// HTTP-Optionen definieren
$options = [
    'http' => [
        'method'  => 'GET',
        'header'  => "Accept: application/xml\r\nUser-Agent: MeinPHP-Client/1.0\r\n",
        'timeout' => 10,
    ],
];

// Stream-Kontext erstellen
$context = stream_context_create($options);

// Kontext für libxml setzen
libxml_set_streams_context($context);

// XML-Dokument über URL laden
$dom = new DOMDocument();
$dom->load('https://example.com/feed.xml');

echo $dom->saveXML();

SimpleXML-Dokument mit Proxy-Einstellungen abrufen

<?php
// Proxy-Einstellungen im HTTP-Kontext
$options = [
    'http' => [
        'proxy'           => 'tcp://proxy.example.com:8080',
        'request_fulluri' => true,
        'header'          => "Authorization: Basic " . base64_encode('user:pass') . "\r\n",
    ],
];

$context = stream_context_create($options);
libxml_set_streams_context($context);

// Fehlerbehandlung aktivieren
libxml_use_internal_errors(true);

$xml = simplexml_load_file('https://api.example.com/data.xml');

if ($xml === false) {
    foreach (libxml_get_errors() as $error) {
        echo 'Fehler: ' . $error->message . PHP_EOL;
    }
    libxml_clear_errors();
} else {
    echo 'Root-Element: ' . $xml->getName() . PHP_EOL;
}

// Wichtig · Fallstricke

Sicherheitshinweis: Wenn externe XML-Dokumente geladen werden, sollten externe Entitäten und DTD-Ladevorgänge deaktiviert werden, um XXE-Angriffe (XML External Entity) zu verhindern. Verwende dazu libxml_disable_entity_loader(true) (PHP < 8.0) bzw. setze LIBXML_NONET als Option beim Laden.

Der Stream-Kontext wird intern gespeichert und gilt nur für den unmittelbar folgenden libxml-Lese- oder Schreibvorgang. Bei mehreren aufeinanderfolgenden Ladevorgängen muss libxml_set_streams_context() jeweils erneut aufgerufen werden.

In älteren PHP-Versionen (vor 5.4) konnte es zu Inkompatibilitäten mit bestimmten Stream-Wrapper-Optionen kommen. Es empfiehlt sich, stets mit aktuellen PHP-Versionen zu arbeiten.