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