Start · Sprachen · PHP · Referenz · curl_multi_close

curl_multi_close

Funktion

Schließt ein cURL-Mehrfach-Handle und gibt alle damit verbundenen Ressourcen frei.

seit PHP 5.0.0 Kategorie: http

Signatur

curl_multi_close(CurlMultiHandle $multi_handle): void

Beschreibung

curl_multi_close() beendet einen mit curl_multi_init() erzeugten cURL-Mehrfach-Handle (CurlMultiHandle) und gibt die zugehörigen Systemressourcen frei. Die Funktion entspricht dem curl_close() für einfache Handles, wirkt jedoch auf einen gesamten Multi-Handle-Kontext.

Bevor curl_multi_close() aufgerufen wird, sollten alle einzelnen cURL-Handles mit curl_multi_remove_handle() aus dem Multi-Handle entfernt und anschließend mit curl_close() geschlossen werden. Andernfalls können Speicherlecks oder undefiniertes Verhalten auftreten.

Typischer Einsatz: Parallele HTTP-Anfragen (z. B. API-Calls an mehrere Endpunkte gleichzeitig) werden über curl_multi_exec() abgearbeitet. Nach Abschluss aller Übertragungen wird der Multi-Handle mit curl_multi_close() ordnungsgemäß abgebaut.

  • Ab PHP 8.0 ist der Parameter vom Typ CurlMultiHandle (zuvor eine generische Ressource).
  • Nach dem Aufruf ist der Handle nicht mehr verwendbar.

Parameter

Name Typ Default Beschreibung
$multi_handle Pflicht CurlMultiHandle Ein gültiger cURL-Mehrfach-Handle, erzeugt mit curl_multi_init().

Rückgabewert

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

Beispiele

Parallele HTTP-Anfragen mit curl_multi und sauberem Abbau

<?php
$urls = [
    'https://httpbin.org/get?id=1',
    'https://httpbin.org/get?id=2',
    'https://httpbin.org/get?id=3',
];

$multiHandle = curl_multi_init();
$handles = [];

// Einzelne Handles erstellen und zum Multi-Handle hinzufügen
foreach ($urls as $i => $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_multi_add_handle($multiHandle, $ch);
    $handles[$i] = $ch;
}

// Alle Anfragen parallel ausführen
$running = null;
do {
    $status = curl_multi_exec($multiHandle, $running);
    if ($status === CURLM_CALL_MULTI_PERFORM) {
        continue;
    }
    curl_multi_select($multiHandle);
} while ($running > 0);

// Antworten auslesen und Handles schließen
foreach ($handles as $i => $ch) {
    $response = curl_multi_getcontent($ch);
    echo "Antwort $i: " . strlen($response) . " Bytes" . PHP_EOL;
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

// Multi-Handle sauber schließen
curl_multi_close($multiHandle);
Antwort 0: 312 Bytes Antwort 1: 312 Bytes Antwort 2: 312 Bytes

Fehlerbehandlung und sicherer Abbau mit try/finally

<?php
$multiHandle = curl_multi_init();
$handles = [];

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

    foreach ($urls as $url) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_multi_add_handle($multiHandle, $ch);
        $handles[] = $ch;
    }

    $running = null;
    do {
        curl_multi_exec($multiHandle, $running);
        curl_multi_select($multiHandle);
    } while ($running > 0);

    foreach ($handles as $ch) {
        if (curl_errno($ch) === 0) {
            echo "OK: " . curl_getinfo($ch, CURLINFO_HTTP_CODE) . PHP_EOL;
        } else {
            echo "Fehler: " . curl_error($ch) . PHP_EOL;
        }
    }
} finally {
    // Ressourcen immer freigeben – auch im Fehlerfall
    foreach ($handles as $ch) {
        curl_multi_remove_handle($multiHandle, $ch);
        curl_close($ch);
    }
    curl_multi_close($multiHandle);
}
OK: 200 OK: 200

// Wichtig · Fallstricke

Reihenfolge beim Aufräumen: Einzelne cURL-Handles müssen zuerst mit curl_multi_remove_handle() aus dem Multi-Handle entfernt und danach mit curl_close() geschlossen werden. Erst dann sollte curl_multi_close() aufgerufen werden. Das Nichteinhalten dieser Reihenfolge kann zu Speicherlecks führen.

Typ-Änderung in PHP 8.0: Vor PHP 8.0 war der Parameter eine generische resource. Ab PHP 8.0 ist er vom dedizierten Typ CurlMultiHandle. Übergabe eines ungültigen Werts löst einen TypeError aus.

try/finally empfohlen: Um Ressourcenlecks auch bei Ausnahmen zu verhindern, empfiehlt sich das Schließen des Multi-Handles im finally-Block.