Aktueller Standort: Startseite> Neueste Artikel> Wie verwendet ich curl_multi_info_read, um eine gleichzeitige Anfrage zu implementieren, ähnlich wie Versprechen.all in JavaScript?

Wie verwendet ich curl_multi_info_read, um eine gleichzeitige Anfrage zu implementieren, ähnlich wie Versprechen.all in JavaScript?

M66 2025-06-15

In der modernen Front-End-Entwicklung ist JavaScripts Versprechen . Alle ist ein leistungsstarkes Tool, um die gleichzeitige Ausführung mehrerer asynchroner Anfragen zu bewältigen. Es ermöglicht gleichzeitig mehrere Anfragen, die darauf warten, dass alle Anfragen abgeschlossen werden, bevor die nachfolgende Logik ausgeführt wird. Als serverseitige Sprache können wir, obwohl PHP keinen direkten Versprechenmechanismus hat, auch eine ähnliche Verarbeitung von gleichzeitigen Anforderungen über die Funktionen der Curl_Multi- Serie implementieren. Dieser Artikel konzentriert sich darauf, zu erklären, wie man curl_multi_info_read verwendet, um eine gleichzeitige Anfrage zu implementieren, ähnlich wie Versprechen.All .


Warum curl_multi verwenden?

Die gewöhnliche Curl_exec ist synchron, was bedeutet, dass jede Anfrage darauf warten muss, dass das Ergebnis zurückkehrt, bevor er den nächsten Schritt weiter ausführt. Wenn mehrere Anfragen gesendet werden müssen, ist die sequentielle Ausführungseffizienz sehr ineffizient. Mit curl_multi können wir mehrere Anforderungen gleichzeitig einleiten und sie dann gleichzeitig verarbeiten, um die Leistung zu verbessern.


Grundlegende Ideen

  1. Erstellen Sie mehrere unabhängige Curl -Handles ( curl_init ).

  2. Fügen Sie diese Griffe einem Curl_Multi -Handle hinzu.

  3. Verwenden Sie CURL_MULTI_EXEC -Schleife, um alle Anforderungen auszuführen.

  4. Erhalten Sie die ausgefüllten Anforderungsinformationen über curl_multi_info_read .

  5. Schließen Sie den ausgefüllten Griff und speichern Sie das Ergebnis.

  6. Warten Sie, bis alle Anfragen abgeschlossen sind, ähnlich wie bei Versprechen. Warten Sie, bis alle Versprechen abgeschlossen sind.


Codebeispiel

Der folgende Beispielcode zeigt, wie mehrere URLs gleichzeitig anfordern und sie gleichmäßig verarbeiten, nachdem alle Anforderungen abgeschlossen sind. Die URL -Domänen im Beispiel werden durch m66.net ersetzt.

 <?php
// AnfordernURLListe
$urls = [
    'https://m66.net/api/user',
    'https://m66.net/api/order',
    'https://m66.net/api/product',
];

// Initialisierung curl_multi Handhaben
$mh = curl_multi_init();
$handles = [];

// Initialisierung所有fragenHandhaben并加入 multi Handhaben
foreach ($urls as $key => $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    // Stellen Sie Zeitüberschreitungen und andere Optionen fest, um sich an Ihre Anforderungen anzupassen
    curl_multi_add_handle($mh, $ch);
    $handles[$key] = $ch;
}

// Führen Sie alle Anfragen aus
$running = null;
do {
    curl_multi_exec($mh, $running);
    // Warten auf eine aktive Verbindung,Effektiv reduzierenCPUNutzungsrate
    curl_multi_select($mh);
    
    // Lesen Sie die abgeschlossene Anfrage
    while ($info = curl_multi_info_read($mh)) {
        if ($info['msg'] == CURLMSG_DONE) {
            // 找出Beendenfragen的Handhaben
            $finishedHandle = $info['handle'];
            // Finden Sie den entsprechenden key
            $key = array_search($finishedHandle, $handles, true);
            
            // Holen Sie sich Inhalts- und Statuscodes
            $content = curl_multi_getcontent($finishedHandle);
            $httpCode = curl_getinfo($finishedHandle, CURLINFO_HTTP_CODE);
            
            echo "fragen {$urls[$key]} Beenden,HTTPStatuscode: {$httpCode}\n";
            echo "Inhaltslänge: " . strlen($content) . " Byte\n\n";
            
            // 关闭并移除已经Beenden的Handhaben
            curl_multi_remove_handle($mh, $finishedHandle);
            curl_close($finishedHandle);
            
            // 将对应Handhaben置空,Bequemes späteres Urteil
            unset($handles[$key]);
        }
    }
} while ($running > 0);

curl_multi_close($mh);

echo "所有fragen均已Beenden。\n";

Code analysieren

  • curl_multi_init () erstellt einen Handle für die Multi-Request-Verarbeitung.

  • Jede curl_init () erstellt eine separate Anforderung und fügt nach der Konfiguration ein Multi-Request-Griff hinzu.

  • Starten Sie die Anforderung über curl_multi_exec () und schleifen Sie an, um anzurufen, bis alle Anforderungen abgeschlossen sind.

  • Verwenden Sie curl_multi_select (), um eine übermäßige CPU -Verwendung zu verhindern.

  • curl_multi_info_read () gibt die ausgefüllten Anforderungsinformationen zurück, ähnlich dem damaligen Rückruf von Versprechen.

  • Nach Abschluss der Anfrage schließen Sie den entsprechenden Griff rechtzeitig und entfernen Sie rechtzeitig, um die Verschwendung von Ressourcen zu vermeiden.

  • Durch den obigen Prozess sind alle Anfragen gleichzeitig gleichzeitig nach Abschluss gleichmäßig verarbeitet, wobei der Effekt ähnlich ist.


Zusammenfassen

Obwohl PHP keinen nativen Mechanismus für Versprechen hat, kann es die Verwaltung und die Ergebnisverarbeitung von gleichzeitigen Anforderungen mithilfe von Curl_Multi -Serienfunktionen, insbesondere CURL_MULTI_INFO_READ , vollständig implementieren. Mit dieser Methode kann die Effizienz von PHP-Skripten bei der Ausführung von mehrstöckigen Aufrufen erheblich verbessert werden und eignet sich besonders für Szenarien, in denen mehrere externe Schnittstellen gleichzeitig aufgerufen werden.

Ich hoffe, dieses Beispiel hilft Ihnen, PHP -Anfragen zu verstehen!