Aktueller Standort: Startseite> Neueste Artikel> Verwenden Sie in der richtigen Reihenfolge curl_multi_close mit curl_multi_init

Verwenden Sie in der richtigen Reihenfolge curl_multi_close mit curl_multi_init

gitbox 2025-05-12

In PHP ist Curl ein leistungsstarkes und häufig verwendetes Netzwerkanforderungs -Tool, und die Funktionen von Curl_Multi_* erlauben uns. Dies ist sehr nützlich für Szenarien wie die Hochleistungs-Grenzflächen-Aggregation, asynchrone Anforderungen usw.

Viele Entwickler ignorieren jedoch häufig den Ressourcenveröffentlichungsprozess, wenn sie curl_multi_* verwendet, insbesondere die Verwendung von curl_multi_close () . Dieser Artikel wird den Standardprozess als Hauptlinie betrachten und Sie zur Verständnis der vollständigen Verwendung von curl_multi_init auf curl_multi_close schrittweise verstehen und wird mit Code -Beispielen ergänzt.

1. Was ist die Funktion curl_multi Series?

Die von PHP bereitgestellte Funktionen von Curl_Multi_* sind Werkzeuge zur Verwaltung mehrerer gleichzeitiger Curl -Handles . Dies unterscheidet sich von der herkömmlichen Single Curl -Anforderung, mit der Sie gleichzeitig mehrere HTTP -Anforderungen einleiten können, wodurch die Effizienz der Antwort verbessert wird.

Die Verwendung dieser Funktionen kann grob in die folgenden Schritte unterteilt werden:

  1. Multi -Handle initialisieren: curl_multi_init ()

  2. Mehrere Curl -Anforderungen hinzufügen (einfaches Handle): curl_multi_add_handle ()

  3. Führen Sie Anforderungen aus: curl_multi_exec () und curl_multi_select ()

  4. Erhalten Sie den Antwortinhalt: curl_multi_getContent ()

  5. Entfernen und schließen Sie einfaches Handle: curl_multi_remove_handle () und curl_close ()

  6. Multi -Griff schließen: CURL_MULTI_CLOSE ()

2. Beispiele für Standardprozesse und Code Beispiele

Hier finden Sie einen Standard-Multi-Request-Prozess, vorausgesetzt, wir müssen gleichzeitig drei verschiedene URLs anfordern:

 <?php

// Anfordern URL Liste
$urls = [
    "https://gitbox.net/api/service1",
    "https://gitbox.net/api/service2",
    "https://gitbox.net/api/service3"
];

// Initialisierung multi handle
$multiHandle = curl_multi_init();
$curlHandles = [];

// 1. Für jeden URL Erstellen a curl easy 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;
}

// 2. implementieren multi fragen
$active = null;
do {
    $mrc = curl_multi_exec($multiHandle, $active);
    // Warten auf das Internet I/O Machen Sie sich bereit,vermeiden CPU Zu hohe Belegung
    if ($mrc == CURLM_OK) {
        curl_multi_select($multiHandle);
    }
} while ($active > 0 && $mrc == CURLM_OK);

// 3. Holen Sie sich Inhalte und saubere Griffe
$responses = [];
foreach ($curlHandles as $i => $ch) {
    // Holen Sie sich den Antwortinhalt
    $responses[$i] = curl_multi_getcontent($ch);

    // Eine einzelne entfernen und schließen handle
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

// 4. Letzter Schließung multi handle,Ressourcen frei machen
curl_multi_close($multiHandle);

// Ausgangsergebnis
foreach ($responses as $index => $body) {
    echo "Response from URL #{$index}: \n";
    echo $body . "\n\n";
}

3. Warum ist CURL_MULTI_CLOSE wichtig?

Obwohl curl_multi_close () den einfachen Griff nicht sofort zerstört (Sie müssen zuerst entfernen und schließen), ist er dafür verantwortlich, die vom Multi -Griff selbst besetzten Ressourcen selbst zu befreien. Wenn Sie es vergessen, es anzurufen, kann dies in langjährigen Skripten wie ansässigen Prozessen Speicherlecks oder die Erschreibung des Dateideskriptors verursachen.

Zusammenfassung: Jedes Skript, das curl_multi_init () verwendet, muss mit curl_multi_close () enden!

4. Häufig gestellte Fragen

  1. Anfragen blockieren und stecken?

    • Überprüfen Sie, ob curl_multi_select () korrekt verwendet wird.

    • Stellen Sie sicher, dass curl_setopt (..., curlopt_returntransfer, true) nicht übersehen wird.

  2. Speicherleck oder Verbindungsausnahme?

5. Zusammenfassung

curl_multi_* bietet ein sehr effizientes Mittel, wenn die Verarbeitung von Netzwerkanforderungen gleichzeitig bearbeitet. Beherrschen des vollständigen Prozesses von CURL_MULTI_INIT () bis curl_multi_close () können die Funktionen der Code -Leistung und des Ressourcenmanagements effektiv verbessern.

Denken Sie an diese drei "Must":

  • Jede Anfrage muss dem Multi -Griff hinzugefügt werden.

  • Jede Anfrage muss nach Fertigstellung entfernt und geschlossen werden.

  • Schließlich muss curl_multi_close () aufgerufen werden, um die Multi -Ressource zu befreien.

Durch standardisiertes Prozess- und Ressourcenmanagement sind Ihre PHP -gleichzeitigen Anfragen robuster und effizienter.