In PHP bieten die Funktionserie von CURL_MULTI_* eine leistungsstarke Möglichkeit, mehrere HTTP -Anfragen gleichzeitig zu initiieren, wodurch die Parallelitätsleistung des Programms verbessert wird. Unter ihnen ist curl_multi_close () eine Funktion, die zur Reinigung von Ressourcen verwendet wird. Es wird aufgerufen, nachdem alle gleichzeitigen Anfragen abgeschlossen sind und ein wichtiger Schritt zur Freigabe der zugrunde liegenden Ressourcen ist. Wenn dies jedoch nicht ordnungsgemäß verwendet wird, kann es Speicherlecks verursachen oder die Anforderung nicht vollständig beendet.
In diesem Artikel werden tatsächliche Codebeispiele verwendet, um zu erklären, wie man curl_multi_close () korrekt verwendet, um langlebige Anforderungen zu beenden.
curl_multi_close () ist die endgültige Funktion, die von curl_multi_init () gepaart wird. Sein Zweck ist es, eine Multi -Handle -Ressource zu schließen und alle damit verbundenen Ressourcen freizugeben. Beachten Sie, dass nicht automatisch jedes einzelne Curl -Griff, das diesem Multi -Griff hinzugefügt wurde, automatisch geschlossen wird. Daher müssen wir es manuell verarbeiten.
Hier ist ein Standardprozess zur Ausführung mehrerer HTTP -Anforderungen mit der Serie von CURL_MULTI_* und Ressourcen korrekt geschlossen:
<?php
// Erstellen Sie die angeforderten URL Array
$urls = [
'https://gitbox.net/api/endpoint1',
'https://gitbox.net/api/endpoint2',
'https://gitbox.net/api/endpoint3',
];
// Initialisierung multi handle
$multiHandle = curl_multi_init();
$curlHandles = [];
// Für jeden URL Initialisierung单独的 curl handle und hinzufügen zu multi handle Mitte
foreach ($urls as $i => $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[$i] = $ch;
}
// Führen Sie alle Anfragen aus
$running = null;
do {
$status = curl_multi_exec($multiHandle, $running);
if ($running) {
curl_multi_select($multiHandle); // vermeiden CPU Zu hohe Belegung
}
} while ($running && $status == CURLM_OK);
// Verarbeiten Sie die Ergebnisse und schließen Sie jeden curl handle
foreach ($curlHandles as $ch) {
$response = curl_multi_getcontent($ch);
$info = curl_getinfo($ch);
echo "Statuscode anfordern: " . $info['http_code'] . "\n";
echo "Antwortinhalt: " . substr($response, 0, 100) . "...\n"; // Nur einige Inhalte zeigen
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
// Letzter Schließung multi handle
curl_multi_close($multiHandle);
Fehler: Multi -Griff schließen, ohne den Griff zu entfernen
// Falsche Verwendung
curl_close($ch); // Zuerst schließen curl handle
curl_multi_close($mh);
Die richtige Reihenfolge sollte sein:
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
curl_multi_close($mh);
Fehler: Nicht auf alle Anfragen zu warten, um abzuschließen
Einige Entwickler überspringen curl_multi_select () direkt oder schließen Sie es direkt nach curl_multi_exec () einmal, was dazu führt, dass einige Anfragen nicht abgeschlossen werden. Die Verwendung einer DO-während- Schleife ist eine zuverlässige Möglichkeit, um sicherzustellen, dass alle Anfragen abgeschlossen sind.
Für langjährige Anfragen (z. B. das Herunterladen großer Dateien oder Remote-Berechnungen) können die folgenden Methoden kontrolliert werden:
Legen Sie einen angemessenen curlopt_timeout fest
Verwenden Sie curl_multi_select () , um die CPU -Verwendung zu reduzieren
Überprüfen und verarbeiten Sie den Status, der von curl_multi_info_read () zurückgegeben wurde)
Beispiel (Hinzufügen von Zeitüberschreitungssteuerung):
curl_setopt($ch, CURLOPT_TIMEOUT, 30); // Stellen Sie die maximale Ausführungszeit auf30Zweite
curl_multi_close () selbst ist nicht kompliziert, aber es muss mit curl_multi_remove_handle () und curl_close () verwendet werden, um sicherzustellen, dass die Ressource vollständig veröffentlicht wird. In Szenarien mit hoher Anforderungen in der Parallelanfragen ist das Schließen von Curl standardisiert der Schlüssel zur Vermeidung von Ressourcenleckagen und die Verbesserung der Programmstabilität.
Beachten Sie bei der Verwendung von Multithread -Netzwerkanfragen die folgende Reihenfolge:
Fügen Sie einem Multi -Griff einen einzelnen Griff hinzu
Multi -Griff ausführen
Ergebnisse erhalten
Einen einzigen Griff entfernen und schließen
Endlich schließen Sie Multi -Griff
Mit der obigen Methode können Sie die Funktionen curl_multi_* effizient verwenden und alle Verbindungen korrekt beenden, um die Wartbarkeit und den Betriebseffizienz Ihres Codes zu verbessern.