Start · Sprachen · PHP · Referenz · CurlShareHandle

CurlShareHandle

Klasse

Vollständig opake Klasse, die ab PHP 8.0.0 eine <code>curl_share</code>-Ressource ersetzt und gemeinsam genutzte Daten zwischen mehreren cURL-Handles verwaltet.

seit PHP 8.0.0 Kategorie: http

Signatur

class CurlShareHandle

Beschreibung

CurlShareHandle ist eine opake Klasse, die in PHP 8.0.0 eingeführt wurde, um den bisherigen resource-Typ für cURL-Share-Handles zu ersetzen. Instanzen dieser Klasse werden ausschließlich durch curl_share_init() erstellt und können nicht manuell instanziiert werden.

Ein cURL-Share-Handle ermöglicht es, bestimmte Daten – wie DNS-Cache, SSL-Session-Daten oder Cookies – zwischen mehreren CurlHandle-Instanzen gemeinsam zu nutzen. Dies ist besonders nützlich bei Anwendungen, die viele parallele oder sequenzielle HTTP-Anfragen durchführen und dabei Overhead durch wiederholte DNS-Auflösungen oder SSL-Handshakes vermeiden wollen.

Der Typ der gemeinsam genutzten Daten wird über curl_share_setopt() mit Konstanten wie CURL_LOCK_DATA_DNS, CURL_LOCK_DATA_SSL_SESSION oder CURL_LOCK_DATA_COOKIE festgelegt. Ein Share-Handle wird einem einzelnen cURL-Handle über curl_setopt($ch, CURLOPT_SHARE, $sh) zugewiesen.

Nach Beendigung der Nutzung sollte das Share-Handle mit curl_share_close() explizit freigegeben werden, obwohl dies ab PHP 8.0 durch den Garbage Collector automatisch übernommen werden kann. Die Klasse selbst bietet keine öffentlichen Methoden oder Eigenschaften – die gesamte Steuerung erfolgt über die zugehörigen curl_share_*-Funktionen.

Beispiele

DNS-Cache zwischen mehreren cURL-Handles teilen

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

// DNS-Cache gemeinsam nutzen
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);

$urls = [
    'https://example.com',
    'https://example.org',
    'https://example.net',
];

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

    $response = curl_exec($ch);
    if ($response === false) {
        echo 'Fehler bei ' . $url . ': ' . curl_error($ch) . PHP_EOL;
    } else {
        echo 'Antwort von ' . $url . ' erhalten (' . strlen($response) . ' Bytes)' . PHP_EOL;
    }
    curl_close($ch);
}

// Share-Handle freigeben
curl_share_close($sh);
Antwort von https://example.com erhalten (1256 Bytes) Antwort von https://example.org erhalten (1020 Bytes) Antwort von https://example.net erhalten (987 Bytes)

SSL-Session und Cookie-Daten gemeinsam nutzen

<?php
$sh = curl_share_init();

// SSL-Session und Cookies zwischen Handles teilen
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);

// Typ-Prüfung: CurlShareHandle-Instanz
if ($sh instanceof CurlShareHandle) {
    echo 'Share-Handle erfolgreich erstellt.' . PHP_EOL;
}

$ch1 = curl_init('https://httpbin.org/cookies/set?foo=bar');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch1, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch1, CURLOPT_SHARE, $sh);
curl_exec($ch1);
curl_close($ch1);

$ch2 = curl_init('https://httpbin.org/cookies');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_SHARE, $sh);
$result = curl_exec($ch2);
echo $result . PHP_EOL;
curl_close($ch2);

curl_share_close($sh);
Share-Handle erfolgreich erstellt. {"cookies": {"foo": "bar"}}

// Wichtig · Fallstricke

Opake Klasse: CurlShareHandle kann nicht mit new CurlShareHandle() instanziiert werden. Die einzige Möglichkeit, eine Instanz zu erhalten, ist der Aufruf von curl_share_init().

Thread-Sicherheit: Das Teilen von Daten zwischen Handles in einem Multi-Thread-Kontext (z. B. mit curl_multi_*) erfordert sorgfältige Synchronisierung. Die CURLSHOPT_LOCKFUNC- und CURLSHOPT_UNLOCKFUNC-Optionen stehen in PHP nicht zur Verfügung, weshalb CurlShareHandle in echter Multithreading-Umgebung mit Vorsicht einzusetzen ist.

Migration von PHP 7: In PHP 7 lieferte curl_share_init() eine resource vom Typ curl_share. Ab PHP 8.0 ist der Rückgabewert eine CurlShareHandle-Instanz. Code, der is_resource() zur Prüfung verwendet, muss auf instanceof CurlShareHandle umgestellt werden.