Start · Sprachen · PHP · Referenz · curl_share_init

curl_share_init

Funktion

Initialisiert einen neuen cURL-Share-Handle, mit dem sich Daten wie Cookies oder DNS-Cache zwischen mehreren cURL-Handles gemeinsam nutzen lassen.

seit PHP 5.0.0 Kategorie: http

Signatur

curl_share_init(): CurlShareHandle

Beschreibung

curl_share_init() erzeugt einen sogenannten Share-Handle, der als gemeinsamer Datenspeicher für mehrere cURL-Übertragungshandles dient. Dies ist nützlich, wenn mehrere HTTP-Anfragen innerhalb eines Skripts denselben DNS-Cache, dieselben Cookies oder TLS-Sitzungsdaten verwenden sollen, ohne diese Informationen redundant für jeden Handle separat zu verwalten.

Nach dem Erstellen des Share-Handles wird mit curl_share_setopt() festgelegt, welche Datentypen geteilt werden sollen (z. B. CURL_LOCK_DATA_COOKIE, CURL_LOCK_DATA_DNS oder CURL_LOCK_DATA_SSL_SESSION). Anschließend wird der Share-Handle jedem cURL-Handle über die Option CURLOPT_SHARE zugewiesen.

Das Teilen von Ressourcen kann die Performance deutlich verbessern, insbesondere bei vielen Anfragen an dieselben Hosts, da DNS-Auflösungen und TLS-Handshakes nicht wiederholt werden müssen. Am Ende sollte der Share-Handle mit curl_share_close() freigegeben werden.

Ab PHP 8.0 gibt die Funktion ein Objekt vom Typ CurlShareHandle zurück anstelle einer Ressource, was eine sauberere objektorientierte Handhabung ermöglicht.

Rückgabewert

Typ
CurlShareHandle
Beschreibung
Gibt einen neuen cURL-Share-Handle zurück (ab PHP 8.0 ein CurlShareHandle-Objekt, davor eine Ressource vom Typ curl_share).

Beispiele

DNS-Cache und Cookies zwischen zwei cURL-Handles teilen

<?php
// Share-Handle erstellen
$sh = curl_share_init();

// DNS-Cache und Cookies sollen geteilt werden
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);

// Ersten cURL-Handle erstellen und Share zuweisen
$ch1 = curl_init('https://example.com/api/users');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch1, CURLOPT_SHARE, $sh);

// Zweiten cURL-Handle erstellen und denselben Share zuweisen
$ch2 = curl_init('https://example.com/api/posts');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_SHARE, $sh);

// Anfragen ausführen (gemeinsamer DNS-Cache wird genutzt)
$response1 = curl_exec($ch1);
$response2 = curl_exec($ch2);

echo "Antwort 1 Länge: " . strlen($response1) . " Bytes\n";
echo "Antwort 2 Länge: " . strlen($response2) . " Bytes\n";

// Ressourcen freigeben
curl_close($ch1);
curl_close($ch2);
curl_share_close($sh);
Antwort 1 Länge: 1234 Bytes Antwort 2 Länge: 5678 Bytes

TLS-Sitzungen teilen für schnellere HTTPS-Verbindungen

<?php
$sh = curl_share_init();

// TLS-Sitzungsdaten teilen, um wiederholte Handshakes zu vermeiden
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);

$urls = [
    'https://api.example.com/endpoint1',
    'https://api.example.com/endpoint2',
    'https://api.example.com/endpoint3',
];

$handles = [];

foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SHARE, $sh); // Share-Handle zuweisen
    $handles[] = $ch;
}

// Alle Handles sequenziell ausführen (TLS-Session wird wiederverwendet)
foreach ($handles as $i => $ch) {
    $result = curl_exec($ch);
    if ($result === false) {
        echo "Fehler bei Handle $i: " . curl_error($ch) . "\n";
    } else {
        echo "Anfrage $i erfolgreich, " . strlen($result) . " Bytes empfangen.\n";
    }
    curl_close($ch);
}

curl_share_close($sh);
Anfrage 0 erfolgreich, 512 Bytes empfangen. Anfrage 1 erfolgreich, 768 Bytes empfangen. Anfrage 2 erfolgreich, 256 Bytes empfangen.

// Wichtig · Fallstricke

Wichtig: Ein Share-Handle darf nicht in einer Umgebung mit mehreren Threads (z. B. über PHP-pthreads) ohne entsprechende Locking-Callbacks (CURLSHOPT_LOCKFUNC / CURLSHOPT_UNLOCKFUNC) verwendet werden, da es sonst zu Race Conditions kommen kann.

Ein cURL-Handle, der einem Share-Handle zugewiesen ist, muss von dem Share-Handle getrennt werden (z. B. durch curl_setopt($ch, CURLOPT_SHARE, null)), bevor der Share-Handle mit curl_share_close() geschlossen wird – andernfalls kann es zu Fehlern kommen.

Die gemeinsam genutzten Cookies können unbeabsichtigt zwischen logisch getrennten Benutzer-Sessions durchsickern, wenn derselbe Share-Handle für verschiedene Nutzeranfragen wiederverwendet wird. In Web-Anwendungen ist daher besondere Vorsicht geboten.