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