Signatur
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
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);
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);
// 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.