Start · Sprachen · PHP · Referenz · curl_close

curl_close

Funktion

Beendet eine cURL-Session und gibt alle mit dem Handle verbundenen Ressourcen frei.

seit PHP 5.0.0 Kategorie: http

Signatur

curl_close(CurlHandle $handle): void

Beschreibung

curl_close() schließt eine mit curl_init() geöffnete cURL-Session und gibt die damit verbundenen Systemressourcen frei. Ab PHP 8.0 ist der Rückgabewert explizit void; bis PHP 7.x gab die Funktion null zurück.

Obwohl PHP Ressourcen am Ende eines Skripts automatisch freigibt, empfiehlt sich der explizite Aufruf von curl_close(), sobald ein Handle nicht mehr benötigt wird – insbesondere in lang laufenden Skripten, Schleifen mit vielen Anfragen oder bei knappem Arbeitsspeicher.

Ab PHP 8.0 arbeitet cURL mit echten CurlHandle-Objekten statt mit alten resource-Werten. Das Handle wird nach dem Schließen ungültig und darf nicht mehr verwendet werden. Der Aufruf von curl_close() auf ein bereits geschlossenes Handle führt zu einem Fehler.

Beim Einsatz von cURL-Multi-Sessions sollte das Handle erst nach curl_multi_remove_handle() mit curl_close() geschlossen werden, um Race Conditions und undefiniertes Verhalten zu vermeiden.

Parameter

Name Typ Default Beschreibung
$handle Pflicht CurlHandle Ein gültiges cURL-Handle, das zuvor mit curl_init() erstellt wurde.

Rückgabewert

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

Beispiele

Einfache HTTP-GET-Anfrage mit anschließendem Schließen

<?php
$ch = curl_init('https://example.com/api/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);

$response = curl_exec($ch);

if ($response === false) {
    echo 'cURL-Fehler: ' . curl_error($ch);
} else {
    echo 'Antwort erhalten: ' . strlen($response) . ' Bytes';
}

curl_close($ch);
// Ab hier ist $ch ungültig und darf nicht mehr verwendet werden.
Antwort erhalten: 1256 Bytes

Mehrere Anfragen in einer Schleife – Ressourcen korrekt freigeben

<?php
$urls = [
    'https://example.com/api/user/1',
    'https://example.com/api/user/2',
    'https://example.com/api/user/3',
];

foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);

    $result = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    echo "URL: {$url} | HTTP-Status: {$httpCode}\n";

    // Handle sofort schließen, damit Ressourcen nicht aufgesammelt werden
    curl_close($ch);
}
URL: https://example.com/api/user/1 | HTTP-Status: 200 URL: https://example.com/api/user/2 | HTTP-Status: 200 URL: https://example.com/api/user/3 | HTTP-Status: 404

Korrekte Reihenfolge bei cURL-Multi-Sessions

<?php
$mh = curl_multi_init();

$ch1 = curl_init('https://example.com/api/a');
$ch2 = curl_init('https://example.com/api/b');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

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

echo curl_multi_getcontent($ch1);
echo curl_multi_getcontent($ch2);

// Erst aus dem Multi-Handle entfernen, dann einzeln schließen
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_close($ch1);
curl_close($ch2);
curl_multi_close($mh);

// Wichtig · Fallstricke

PHP 8.0+: Der Typ des Parameters wurde von resource auf CurlHandle geändert. Code, der explizit auf is_resource() prüft, muss auf $ch instanceof CurlHandle umgestellt werden.

Reihenfolge bei Multi-Sessions: Ein Handle darf erst nach curl_multi_remove_handle() geschlossen werden. Wird curl_close() vorher aufgerufen, können laufende Übertragungen abgebrochen werden und das Verhalten ist undefiniert.

Wiederverwendung: Ein geschlossenes Handle kann nicht wiederverwendet werden. Soll dasselbe Handle für mehrere Anfragen eingesetzt werden, empfiehlt sich curl_reset() statt curl_close() gefolgt von einem neuen curl_init().