Aktueller Standort: Startseite> Neueste Artikel> So verwenden Sie Curl_Multi_* -Serie-Funktionen, um eine hohe Leistung gleichzeitige Anfragen zu erzielen

So verwenden Sie Curl_Multi_* -Serie-Funktionen, um eine hohe Leistung gleichzeitige Anfragen zu erzielen

M66 2025-06-02

In PHP müssen wir häufig Netzwerkanfragen mit externen APIs, Websites oder Diensten stellen. Obwohl die reguläre einzelne Anforderung in hoher Parallelitätsszenarien einfach ist, ist der Leistungsengpass sehr offensichtlich: Jede Anforderung wird nacheinander ausgeführt, wobei die Vorgängeranforderung vor dem nächsten abgeschlossen ist, was zu einer linearen Zunahme der Gesamtzeit führt.

Um die Effizienz der Netzwerkanforderung zu verbessern, bietet PHP zwei sehr leistungsstarke Tools: Curl_Share_init () und curl_multi_* Serienfunktionen. In diesem Artikel wird ein detaillierter Untersuchung angezeigt, in dem sie mithilfe von gleichzeitigen Anfragen mit hohen Leistungsanforderungen erfolgen können.

1 ?? Die Rolle von curl_share_init ()

curl_share_init () wird verwendet, um Daten zwischen mehreren COLL -Handles wie DNS -Cache, Cookies, SSL -Sitzungen usw. zu teilen, usw.

Zum Beispiel: Wenn Sie gleichzeitig mehrere Adressen desselben Domänennamens anfordern müssen, kann das Aktivieren des gemeinsam genutzten DNS -Cache die DNS -Abfragezeit erheblich verkürzen.

 $sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);

Dieser Code initialisiert einen gemeinsam genutzten Griff und wird so eingestellt, dass DNS -Daten freigegeben werden. Als nächstes werden wir diesen gemeinsam genutzten Griff an jede Curl -Anfrage binden.

2 ?? curl_multi_* Funktion der Serienfunktionen

Mit der Funktion von Curl_Multi_* ermöglichen es uns, mehrere HTTP -Anforderungen gleichzeitig zu initiieren, anstatt sie einzeln wie curl_exec () zu senden.

Die Hauptfunktionen umfassen:

3 ?? Praktisches Beispiel: Gleichzeitige Anfragen für mehrere URLs

Hier ist ein vollständiges Beispiel, das zeigt, wie die Funktionen curl_share_init () und curl_multi_* verwendet werden, um mehrere Adressen gleichzeitig anzufordern.

 <?php

// Anfordern URL Liste
$urls = [
    'https://m66.net/api/endpoint1',
    'https://m66.net/api/endpoint2',
    'https://m66.net/api/endpoint3'
];

// Initialisieren Sie den gemeinsam genutzten Griff
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);

// Initialisierung multi Handhaben
$mh = curl_multi_init();
$curl_handles = [];

// Für jeden URL Erstellen Sie eine separate curl Handhaben
foreach ($urls as $i => $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SHARE, $sh); // 绑定共享Handhaben
    curl_multi_add_handle($mh, $ch);
    $curl_handles[$i] = $ch;
}

// Führen Sie alle Anfragen aus
$running = null;
do {
    $status = curl_multi_exec($mh, $running);
    if ($status > 0) {
        echo "cURL error: " . curl_multi_strerror($status) . "\n";
    }
    // Warten auf eine aktive Verbindung
    curl_multi_select($mh);
} while ($running > 0);

// Ergebnisse erhalten
$responses = [];
foreach ($curl_handles as $i => $ch) {
    $responses[$i] = curl_multi_getcontent($ch);
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

// Schließung multi Und share Handhaben
curl_multi_close($mh);
curl_share_close($sh);

// Ausgangsergebnis
foreach ($responses as $i => $response) {
    echo "Response from URL $i:\n$response\n\n";
}
?>

4 ?? Leistungsverbesserungsanalyse

Mit Curl_Multi_* werden alle Anforderungen so weit wie möglich gleichzeitig ausgeführt, und die Gesamtzeit liegt eher der längsten einzelnen Anfrage als der Summe.

Durch die Verwendung von Curl_Share_init () kann der Overhead von doppelten DNS -Abfragen, SSL -Handshakes usw. reduziert und die Leistung weiter optimieren.

In Szenarien, in denen eine hohe Parallelität und häufige Anforderungen für dieselbe Domänenname -API (z. B. gleichzeitig mehreren Schnittstellen, Crawling -Webseiten in Stapeln, Synchronisierung mehrerer Microservice -Daten usw.), kann diese Kombination die Effizienz erheblich verbessern.

5 ?? Notizen

  • Die DNS -Freigabe beschleunigt nicht immer wesentlich : Sie wirkt sich hauptsächlich unter demselben Domänennamen und mehreren Anforderungen in Kraft.

  • Annäherweise eingestelltes Zeitüberschreitungen : Eine festgefahrene Anfrage in gleichzeitiger Situation kann die Gesamtsituation beeinflussen.

  • Kontrolle der Anzahl der Parallelität : Zu viele Anfragen können dazu führen, dass der Server oder die lokalen Ressourcen erschöpft sind und in Semaphoren oder Chargen verteilt werden können.

  • Fehlerbehandlung : Im Beispiel konnte die einzelne Anforderung ausführlich bearbeitet werden und die tatsächliche Anwendung muss ergänzt werden.