Aktueller Standort: Startseite> Neueste Artikel> So vermeiden Sie den Verbindungsstatus -Ausnahmen nach CURL_MULTI_CLOSE

So vermeiden Sie den Verbindungsstatus -Ausnahmen nach CURL_MULTI_CLOSE

gitbox 2025-05-12

Die Serienfunktionen curl_multi_* sind sehr wichtige Tools, wenn die Curl -Erweiterung von PHP für gleichzeitige Anforderungen verwendet wird. curl_multi_close ist für das Schließen eines Curl -Multi -Griffs verantwortlich. Wenn dies jedoch nicht ordnungsgemäß verwendet wird, kann dies leicht zu einem abnormalen Verbindungsstatus führen, wie z. Wie können wir diese Ausnahmen anmutig und richtig vermeiden? Dieser Artikel erklärt sich im Detail.

Häufige Fehler

Wenn viele Entwickler gleichzeitige Anfragen bearbeiten, kann der Code so aussehen:

 <?php
$mh = curl_multi_init();
$ch1 = curl_init('https://gitbox.net/api/endpoint1');
$ch2 = curl_init('https://gitbox.net/api/endpoint2');

curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// Starten und ausführen
do {
    $status = curl_multi_exec($mh, $active);
    curl_multi_select($mh);
} while ($active && $status == CURLM_OK);

// Direkt schließen
curl_multi_close($mh);

Das Problem bei dieser Schreibmethode ist, dass auch wenn die Anforderung nicht vollständig verarbeitet wurde (insbesondere wenn die Netzwerkbedingungen schlecht sind), curl_multi_close direkt aufgerufen wird, was dazu führt, dass einige Verbindungen grob beendet werden, und infolgedessen tritt natürlich eine Zustandsanomalie auf.

Die richtige Art, es zu tun

Bevor Sie curl_multi_close aufrufen, sollten Sie sicherstellen, dass alle Griffe ( Curl -Griff ) verarbeitet und entfernt werden! Der richtige Prozess sollte sein:

  1. Curl_multi_exec wird wiederholt aufgerufen, bis alle Anforderungen abgeschlossen sind.

  2. Entfernt jeden einzelnen Curl -Handle ( curl_multi_remove_handle ).

  3. Schließen Sie einen einzelnen Curl -Handle ( curl_close ) separat.

  4. Schließlich schließen Sie Multi -Handle ( curl_multi_close ).

Das Beispiel für geänderte Code lautet wie folgt:

 <?php
$mh = curl_multi_init();
$ch1 = curl_init('https://gitbox.net/api/endpoint1');
$ch2 = curl_init('https://gitbox.net/api/endpoint2');

curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// Starten und ausführen
do {
    $status = curl_multi_exec($mh, $active);
    if ($active) {
        curl_multi_select($mh);
    }
} while ($active && $status == CURLM_OK);

// Eine einzelne entfernen und schließen handle
curl_multi_remove_handle($mh, $ch1);
curl_close($ch1);

curl_multi_remove_handle($mh, $ch2);
curl_close($ch2);

// Letzter Schließung multi handle
curl_multi_close($mh);

Achten Sie auf Details

  • curl_multi_remove_handle muss vor curl_multi_close durchgeführt werden.

  • Auch wenn die Verbindung nicht anfordert, muss sie durch REMEDE_HANDLE + CLEY korrekt gereinigt werden.

  • Durch die Verwendung von Curl_Multi_Select in einer Schleife kann die CPU -Verwendung reduziert und das Warten vermeiden.

  • Versuchen Sie, Fehler zu fangen (z. B. Curl_errno und Curl_error ) und vertrauen Sie der Anfrage nicht blind, um erfolgreich zu sein.

Zusammenfassen

In hohen Parallelitätsszenarien bestimmen Details Erfolg oder Misserfolg. Die Essenz von CURL_MULTI_CLOSE besteht darin, nur den Multi -Griff zu zerstören, der selbst nicht die sichere Schließung aller einzelnen Verbindungen garantieren kann. Entfernen Sie vor dem Schließen des Multi -Griffs jeden einzelnen Griff manuell und schließen Sie manuell , was der Schlüssel zur Vermeidung von Ausnahmen des Verbindungsstatus ist.

Nach dem korrekten Verarbeitungsprozess können Ihre gleichzeitigen Anfragen stabil und effizient aus diesen mit Kopfschmerzanfälligen verborgenen Fehler ausführen.