Aktueller Standort: Startseite> Neueste Artikel> So halten Sie die Reihenfolge in curl_multi_close asynchroner Anfrage

So halten Sie die Reihenfolge in curl_multi_close asynchroner Anfrage

gitbox 2025-05-12

Curl ist ein sehr leistungsstarkes Werkzeug in PHP, wenn mehrere asynchrone HTTP -Anforderungen erstellt werden. Mit der Funktion curl_multi_* können Entwickler gleichzeitig mehrere Anforderungen einleiten, um die Effizienz zu verbessern. Die Funktion curl_multi_close wird zum Schließen mehrerer Curl -Sitzungen verwendet. Wie stellen Sie jedoch die Reihenfolge der Antworten sicher, wenn Sie asynchrone Anfragen stellen? Da curl_multi_exec Antworten für mehrere Anfragen zurückgeben kann, und die Reihenfolge, in der diese Antworten abgeschlossen werden können, kann sich von der Reihenfolge unterscheiden, in der sie angefordert werden.

In diesem Artikel wird detailliert erläutert, wie die Ergebnisse asynchroner Anfragen die Reihenfolge der Anforderungen bei der Verwendung von curl_multi_close beibehalten.

1. Was ist die Funktion curl_multi_*?

Die Funktionserie von CURL_MULTI_* bietet eine Möglichkeit, die Leistung durch gleichzeitige Anfragen zu verbessern. Einige häufig verwendete Funktionen umfassen:

  • curl_multi_init () : initialisieren Sie einen Curl -Handle und erstellen Sie einen Curl -Ressourcenpool.

  • CURL_MULTI_ADD_HANDLE () : Fügt dem mehrfachen Curl -Anforderungspool einen Curl -Handle hinzu.

  • CURL_MULTI_EXEC () : Führen Sie mehrere Curl -Anforderungen aus.

  • curl_multi_getContent () : Erhalten Sie den Antwortinhalt jeder Anforderung.

  • CURL_MULTI_CLOSE () : Schließen Sie den Curl -Anforderungspool und geben Sie die Ressourcen frei.

Diese Funktionen werden häufig zusammen verwendet, um asynchrone Anfragen durchzuführen, wodurch die Leistung verbessert wird. Da sich jedoch die Reihenfolge der Abschluss der Antworten von der Reihenfolge der Anfragen unterscheiden kann, wird die Sicherstellung der Reihenfolge der Antwortergebnisse zu einem wichtigen Problem.

2. Wie können Sie die Reihenfolge der asynchronen Anfrageergebnisse sicherstellen?

Bei asynchronen Anforderungen stellt CURL_MULTI_EXEC gleichzeitig mehrere Anforderungen im Hintergrund ein und wartet, bis alle Anfragen abgeschlossen sind. Die Fertigstellung dieser Anfragen ist jedoch unvorhersehbar, sodass ihre Reaktionsordnung gestört werden kann.

Um sicherzustellen, dass die Ergebnisse in der Reihenfolge verarbeitet werden, müssen wir einen Mechanismus verwenden, um die Zuordnungsbeziehung zwischen der Anforderung und der Antwort aufzuzeichnen. Eine gängige Praxis besteht darin, assoziative Arrays zu verwenden. Insbesondere kann der Entwickler eine eindeutige Kennung für jede Anforderung festlegen und die Ergebnisse nach diesem Kennung nach Empfang der Antwort korrekt sortieren.

Hier ist ein Implementierungsbeispiel:

3. PHP -Beispielcode

 <?php

// AnfordernURLListe
$urls = [
    'https://gitbox.net/api/data1',
    'https://gitbox.net/api/data2',
    'https://gitbox.net/api/data3'
];

// Initialisierung cURL multi Handhaben
$mh = curl_multi_init();

// fragenHandhaben数组
$curl_handles = [];
$responses = [];
$index = 0;

// Erstellen Sie für jede Anfrage cURL Handhaben并添加到 multi Handhaben中
foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    
    // Notieren Sie den Index jeder Anfrage,So dass die Antworten in der Reihenfolge verarbeitet werden
    curl_multi_add_handle($mh, $ch);
    
    // 将Handhaben与索引关联
    $curl_handles[(string)$ch] = $index++;
}

// Alles ausführen cURL fragen
$running = null;
do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh); // Lassen Sie das Programm warten, bis die Daten zurückgegeben werden
} while ($running > 0);

// 读取每个fragen的响应,并按fragen的顺序保存结果
foreach ($curl_handles as $ch => $index) {
    $response = curl_multi_getcontent($ch);
    $responses[$index] = $response; // Speichern Sie die Antwort nach Index
    curl_multi_remove_handle($mh, $ch); // 移除Handhaben
    curl_close($ch); // 关闭每个Handhaben
}

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

// Ausgangsantwortergebnis,确保按照fragen顺序输出
foreach ($responses as $response) {
    echo $response . PHP_EOL;
}
?>

4. Code Parsen

4.1 Die Reihenfolge der Anfragen und Antworten

Im obigen Code initialisieren wir zunächst einen Curl -Multi -Handle und erstellen für jede URL einen Curl -Griff. Um sicherzustellen, dass die Antworten in der Reihenfolge zurückgegeben werden, verwenden wir ein assoziatives Array $ curl_handles , das jeden Curl -Handle mit seinem Index in der Anforderungsliste assoziiert.

Wenn alle Anfragen abgeschlossen sind, iterieren wir dieses assoziative Array und speichern jede Antwort im $ Rese -Array gemäß dem Index, um die Reihenfolge der Antworten zu gewährleisten.

4.2 Asynchrone Ausführung und Warten

Wenn alle Anforderungen mit Curl_Multi_exec ausgeführt werden, wird der laufende Parameter verwendet, um die Anzahl der noch ausgeführten Anforderungen anzugeben. curl_multi_select lässt das Programm blockieren, wenn keine Daten zurückgegeben werden, bis eine Anfrage abgeschlossen ist, um sicherzustellen, dass wir keine CPU -Ressourcen verschwenden.

4.3 Ressourcen veröffentlicht

Schließlich verwenden wir curl_multi_remove_handle und curl_close , um alle Curl -Handles zu schließen, und verwenden curl_multi_close , um mehrere COLL -Handles zu schließen, um verwandte Ressourcen freizugeben.

5. Zusammenfassung

Durch die Verwendung der assoziativen Arrays können wir sicherstellen, dass bei der Durchführung asynchroner Anfragen die Antwortergebnisse in der Reihenfolge von Anfragen zurückgegeben werden. Bei Verwendung der Funktionsreihe curl_multi_* für asynchrone Anforderungen in PHP ist es wichtig, die Reihenfolge aufrechtzuerhalten, insbesondere bei der Behandlung von Antworten von mehreren Schnittstellen. In diesem Beispiel können Sie besser verstehen, wie Sie in PHP asynchrone Anfragen stellen und die Reihenfolge sicherstellen, die Programmleistung und Stabilität verbessern.