Aktueller Standort: Startseite> Neueste Artikel> So beenden Sie mit CURL_MULTI_CLOSE korrekte Anfragen

So beenden Sie mit CURL_MULTI_CLOSE korrekte Anfragen

gitbox 2025-05-12

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.

1. Was ist curl_multi_close?

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.

2. Ein grundlegendes Beispiel für gleichzeitige Anfragen

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);

3.. Häufige Fehler und Lösungen

  1. 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);
    
  2. 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.

4. Was sollte getan werden, wenn die Anfrage lange dauert?

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

5. Zusammenfassung

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:

  1. Fügen Sie einem Multi -Griff einen einzelnen Griff hinzu

  2. Multi -Griff ausführen

  3. Ergebnisse erhalten

  4. Einen einzigen Griff entfernen und schließen

  5. 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.