Aktueller Standort: Startseite> Neueste Artikel> So behandeln Sie curl_multi_close und erhalten trotzdem das Rückgabeergebnis

So behandeln Sie curl_multi_close und erhalten trotzdem das Rückgabeergebnis

gitbox 2025-05-29

In PHP wird die Funktion curl_multi_* verwendet, um mehrere Curl -Anforderungen gleichzeitig zu initiieren, um die Effizienz der Anforderung zu verbessern. Wenn Sie jedoch curl_multi_close aufrufen, um eine mehrfache Curl -Sitzung zu beenden, können Sie das Rückgabeergebnis der Anforderung nicht mehr erhalten, da die Funktion alle zugehörigen Handles schließt. Um das Rückgabeergebnis jeder Anfrage nach dem Aufrufen von CURL_MULTI_CLOSE noch zu erhalten, sind einige Tricks erforderlich.

In diesem Artikel werden wir erläutern, wie das Rückgabeergebnis aller Anfragen nach curl_multi_close korrekt abgerufen werden kann.

Verwenden Sie Curl_Multi_getContent, um das Rückgabeergebnis zu erhalten

Nach dem Aufrufen von curl_multi_close kann der Antwortinhalt jeder Curl -Anforderung über curl_multi_getContent erhalten werden. Um alle zurückgegebenen Ergebnisse korrekt zu erhalten, muss sichergestellt werden, dass die Ergebnisse jeder Anfrage vor dem Schließen der Curl -Sitzung erhalten bleiben.

Hier ist ein vollständiges Beispiel:

 <?php
// InitialisierungcURLHandhaben
$urls = [
    'https://gitbox.net/api/endpoint1',
    'https://gitbox.net/api/endpoint2',
    'https://gitbox.net/api/endpoint3'
];

$multiCurl = curl_multi_init();
$curlHandles = [];

// Für jedenURLerstellencURLHandhaben并添加到多重请求队列
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Holen Sie sich den zurückgegebenen Inhalt
    curl_multi_add_handle($multiCurl, $ch);
    $curlHandles[] = $ch;
}

// Führen Sie alle Anfragen aus
$running = null;
do {
    curl_multi_exec($multiCurl, $running);
    curl_multi_select($multiCurl);
} while ($running > 0);

// Holen Sie sich das Ergebnis jeder Anfrage
$responses = [];
foreach ($curlHandles as $ch) {
    $responses[] = curl_multi_getcontent($ch);
    curl_multi_remove_handle($multiCurl, $ch); // 从多重请求队列中移除Handhaben
}

// SchließungcURLMehrere Gespräche
curl_multi_close($multiCurl);

// Ausgabe des Rückgabeergebnisses für jede Anfrage ausgeben
foreach ($responses as $response) {
    echo $response . "\n";
}
?>

Code analysieren

  1. Initialisieren Sie mehrere Anfragengriffe :

    • Wir definieren zunächst eine Reihe von $ URLs , die alle URLs anfordern. In diesem Beispiel werden alle URLs durch Gitbox.net -Domain -Namen ersetzt.

    • Anschließend erstellen wir für jede URL ein Curl -Handle $ CH und fügen sie der mehrfachen Curl -Sitzung hinzu.

  2. Führen Sie die Anfrage aus :

    • Verwenden Sie curl_multi_exec (), um alle an die Sitzung hinzugefügten Anforderungen auszuführen. Wir verwenden curl_multi_select (), um sicherzustellen, dass wir erst nach Abschluss der Anfrage im Leerlauf sind.

  3. Holen Sie sich das Anfrageergebnis :

    • Nachdem alle Anfragen abgeschlossen sind, verwenden wir curl_multi_getContent ($ ch), um den Rückgabeinhalt jeder Anforderung zu erhalten und sie im Array $ rese zu speichern.

  4. Aufräumen :

    • Wir verwenden curl_multi_remove_handle ($ multicurl, $ ch) , um jeden Curl -Handle aus den mehreren Sitzungen zu entfernen und CURL_MULTI_CLOSE () aufzurufen, um die gesamte Curl -Sitzung zu schließen.

  5. Ausgabemantworten Inhalt :

    • Iterieren Sie schließlich über das Array $ Rese und geben den Antwortinhalt jeder Anforderung aus.

Dinge zu beachten

  • Asynchrone Verarbeitung : Einer der größten Vorteile der Funktion curl_multi_* besteht darin, dass sie mehrere Anforderungen gleichzeitig senden kann, was besonders für gleichzeitige Anforderungen nützlich ist. Auch im Multi-Request-Szenario kann Curl_Multi_getContent das Rückgabeergebnis jeder Anforderung korrekt erhalten.

  • Anforderungszeitüberschreitungsverarbeitung : In realen Szenarien müssen Sie möglicherweise auch eine Zeitüberschreitungsoption für jede Anforderung festlegen, z. B. curlopt_timeout , um eine Anforderung zu vermeiden, die andere Anforderungen aufgrund langsamer Serverantwort blockiert.

  • Fehlerbehandlung : Wenn Sie CURL verwenden, müssen Sie immer überprüfen, ob die Anforderung erfolgreich ist, und verwenden Sie Curl_errno ($ CH), um den Fehlercode zu erhalten, um das Problem in der Anforderung zu identifizieren.