Aktueller Standort: Startseite> Neueste Artikel> So implementieren Sie die Zeitlimitsteuerung von Anforderungen in CURL_MULTI_CLOSE

So implementieren Sie die Zeitlimitsteuerung von Anforderungen in CURL_MULTI_CLOSE

gitbox 2025-05-12

In PHP können Sie mit der Serie curl_multi_* mehrere HTTP -Anforderungen gleichzeitig senden und die Ausführungseffizienz des Programms erheblich verbessern. Wenn jedoch viele Menschen Curl_Multi_Close verwenden, um mehrköpfige Sitzungen zu beenden, ignorieren sie ein wichtiges Thema:

Wenn die Zeitüberschreitungszeit nicht angemessen kontrolliert wird und eine Anfrage für lange Zeit nicht mehr reagiert, kann die gesamte Anwendung stecken bleiben, was zu einer sehr schlechten Benutzererfahrung führt. In diesem Artikel wird Beispiele verwendet, um Ihnen bei der Verwendung von Timeout -Steuerung bei der Verwendung von curl_multi_close beizubringen.

Grundlegende Ideen

Tatsächlich wird CURL_MULTI_CLOSE nur zum Schließen des Curl_Multi -Handels verwendet und steuert die Zeitüberschreitung selbst nicht . Das Echtzeit -Steuerelement sollte in der Phase der Ausführung der Anforderung (d. H. curl_multi_exec und curl_multi_select ) erfolgen.

Einfach ausgedrückt, Timeout Control hängt davon ab:

  • Stellen Sie die Zeitüberschreitung auf einem einzigen Curl -Griff ein

  • Aufzeichnen und beurteilen Sie die Gesamtzeit in der Ausführungsschleife

Beispielcode

Hier ist ein praktisches Beispiel. Nehmen wir an, wir haben zwei Anfragen, die https://gitbox.net/api/endpoint1 und https://gitbox.net/api/endpoint2 anfordern. Wir hoffen, dass alle Anfragen insgesamt nicht mehr als 10 Sekunden dauern.

 <?php

// Zwei erstellen cURL Handhaben
$ch1 = curl_init('https://gitbox.net/api/endpoint1');
$ch2 = curl_init('https://gitbox.net/api/endpoint2');

// Stellen Sie eine Zeitüberschreitung für jede Anfrage separat fest(Optional)
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch1, CURLOPT_TIMEOUT, 8); // Die meisten Anfragen pro Person8Zweite
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_TIMEOUT, 8);

// Erstellen a cURL 批处理Handhaben
$mh = curl_multi_init();

// 添加Handhaben到批处理Handhaben中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// Stapelverarbeitung durchführen
$startTime = microtime(true);
$timeout = 10; // Gesamtzeitüberschreitung(Zweite)

do {
    $status = curl_multi_exec($mh, $active);

    // Wenn es noch eine aktive Verbindung gibt
    if ($active) {
        // Blockieren und Warten
        $n = curl_multi_select($mh, 1.0);

        // Wenn select zurückkehren -1,Vermeiden Sie das Warten
        if ($n === -1) {
            usleep(100000); // schlafen100毫Zweite
        }
    }

    // Überprüfen Sie, ob Timeout
    if ((microtime(true) - $startTime) > $timeout) {
        echo "Die Gesamtzeit zur Anfrage übersteigt über{$timeout}Zweite,Erzwungene Unterbrechung。\n";
        break;
    }
} while ($active && $status == CURLM_OK);

// Lesen Sie das Ergebnis
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);

// 关闭Handhaben
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
curl_close($ch1);
curl_close($ch2);

// Druckergebnisse
echo "Response 1: " . substr($response1, 0, 100) . "...\n";
echo "Response 2: " . substr($response2, 0, 100) . "...\n";
?>

Zusammenfassung der wichtigsten Punkte

  1. Curlopt_timeout steuert die Zeitüberschreitung einer einzelnen Anfrage ;

  2. Durch die Aufzeichnung von Mikrotime (TRUE) wird die Gesamtausführungszeit manuell kontrolliert.

  3. Setzen Sie bei Verwendung von curl_multi_select einen geeigneten Zeitlimitwert (z. B. 1 Sekunde), um eine übermäßige CPU -Verwendung zu vermeiden.

  4. curl_multi_close ist nur für die Reinigung von Ressourcen verantwortlich und steuert keine Timeout -Logik .

Dinge zu beachten

  • Wenn Sie eine zu kurze Auswahl ausgewählte Zeitüberschreitung festlegen (z. B. 0,01 Sekunden), kann die Systemlast zunehmen.

  • Wenn curl_multi_select -1 zurückgibt, bedeutet dies, dass kein Dateideskriptor wartet und einen ordnungsgemäßen Schlaf ( usleep ) erfordert, um geschäftige Schleifen zu vermeiden.

  • Wenn eine Zeitüberschreitung auftritt, ist es am besten, die unvollendete Anfrage proaktiv zu stornieren, um Ressourcenleckage zu vermeiden.