Bei der Behandlung einer großen Anzahl von gleichzeitigen HTTP -Anforderungen sind die Funktionen der Curl_Multi -Serie in PHP ein sehr praktisches Werkzeug. Unter ihnen ist CURL_MULTI_CLOSE ein unverzichtbarer Schritt in der letzten Phase, mit der Ressourcen, die von Curl_Multi_init erstellt wurden, korrekt freigeben. In diesem Artikel wird die korrekte Verwendung von curl_multi_close erläutert und ein praktisches Beispiel für Sie hilft, um häufig auftretende Probleme mit Leckagen mit Ressourcen zu vermeiden.
Immer wenn ein Curl -Multi -Handle mit curl_multi_init erstellt wird, weist PHP ein Stück Speicher zur Verwaltung des Multi -Griffs und die verschiedenen Anforderungen zu. Selbst wenn ein einzelner Klongriff (von Curl_init erzeugt) mit Curl_Close geschlossen wurde, belegt das Gesamtmulti -Handle weiterhin Systemressourcen.
Wenn Sie vergessen, curl_multi_close zu verwenden, ist es einfach, Speicherleckage und sogar Programmabstürze in hohen Parallelitätsszenarien zu verursachen.
Daher muss curl_multi_close nach Abschluss aller gleichzeitigen Anfragen aufgerufen werden, um die Ressource vollständig zu befreien .
Der allgemeine Prozess der Verwendung der Funktionen curl_multi ist wie folgt:
Multi -Handle erstellen ( curl_multi_init )
Erstellen und Konfigurieren mehrerer separater Curl -Handles ( curl_init )
Fügen Sie jeden Curl -Handle zum Multi -Handle hinzu ( CURL_MULTI_ADD_HANDLE )
Führen und überwachen Sie alle Anforderungen ( curl_multi_exec und curl_multi_select )
Entfernen Sie ein einzelnes Handle ( curl_multi_remove_handle ) und schließen ( curl_close )
Schließlich schließen Sie Multi -Griff ( curl_multi_close )
Hier ist ein vollständiges Beispiel, das zeigt, wie mehrere URLs gleichzeitig anfordern und alle relevanten Ressourcen korrekt bereinigt werden:
<?php
// Um gleichzeitige Anfragen zu sendenURLListe
$urls = [
"https://gitbox.net/api/endpoint1",
"https://gitbox.net/api/endpoint2",
"https://gitbox.net/api/endpoint3",
];
// Initialisierung multi handle
$multiHandle = curl_multi_init();
$curlHandles = [];
// Initialisierung每个单独的 curl handle Und beitreten multi handle
foreach ($urls as $key => $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[$key] = $ch;
}
// Eine Anfrage ausführen
$running = null;
do {
$status = curl_multi_exec($multiHandle, $running);
if ($status > CURLM_OK) {
// Fehlerbehandlung
echo "cURL error: " . curl_multi_strerror($status);
break;
}
// Warten auf eine aktive Verbindung
curl_multi_select($multiHandle);
} while ($running > 0);
// Reaktionsergebnisse sammeln
$responses = [];
foreach ($curlHandles as $key => $ch) {
$responses[$key] = curl_multi_getcontent($ch);
// Jedes Kind entfernen und schließen handle
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
// Letzter Schließung multi handle
curl_multi_close($multiHandle);
// Ausgangsantwort
foreach ($responses as $index => $response) {
echo "Response from URL {$urls[$index]}:" . PHP_EOL;
echo $response . PHP_EOL . PHP_EOL;
}
?>
Entfernen Sie zuerst die einzelnen Curl -Griffe , schließen Sie sie und schließen Sie schließlich Multi -Griffe.
Schließen Sie den Multi -Griff nicht direkt und betreiben Sie dann den Kindergriff , da er unvorhersehbare Fehler verursacht.
In Umgebungen mit hoher Parallelität wird empfohlen, eine Zeitüberschreitungsregelung ( curlopt_timeout ) hinzuzufügen, um eine langfristige Blockade zu verhindern.
curl_multi_close ist der letzte Schritt, um die angemessene Version von Ressourcen zu gewährleisten. Insbesondere in Multi-Concurrency-Szenarien ist es sehr wichtig, gute Abschlussgewohnheiten zu entwickeln. Durch korrektes Reinigen der Klauselverhandlung und schließlich Schließen des Multi -Griffs kann die Stabilität und Leistung von PHP -Anwendungen effektiv verhindern.