Aktueller Standort: Startseite> Neueste Artikel> So kombinieren Sie curl_multi_exec () und curl_share_init (), um eine gleichzeitige Anforderungsoptimierung zu erreichen

So kombinieren Sie curl_multi_exec () und curl_share_init (), um eine gleichzeitige Anforderungsoptimierung zu erreichen

M66 2025-05-18

In der modernen Webentwicklung ist die Bearbeitung einer großen Anzahl von HTTP -Anforderungen eine häufigste Anforderung, z. Zu diesem Zweck bietet PHP Curl_Multi_* Serienfunktionen, um gleichzeitige Anforderungen zu implementieren, während die Curl_Share_* -Serie Ressourcen (z. B. DNS -Cache) zwischen mehreren Curl -Handles freigeben kann, um die Leistung weiter zu optimieren. In diesem Artikel wird vorgestellt, wie man curl_multi_exec () und curl_share_init () kombiniert, um eine effiziente gleichzeitige Anforderungsoptimierung zu erreichen.

1 ?? Warum verwenden Sie curl_multi_*?

Mit der Funktion von CURL_MULTI_* ermöglichen es uns, mehrere HTTP -Anfragen gleichzeitig zu senden, anstatt in Zeile eins nach dem anderen zu warten. Sein Kernworkflow ist:

  1. Initialisieren Sie einen Multi -Handle ( curl_multi_init ).

  2. Fügen Sie dem Multi -Griff mehrere einfache Griffe ( curl_init ) hinzu.

  3. Verwenden Sie curl_multi_exec (), um gleichzeitige Anforderungen zu steuern.

  4. Verwenden Sie curl_multi_select (), um auf den aktiven Griff zu warten (vermeiden Sie CPU -Leerlauf).

  5. Erfassen Sie Ergebnisse und schließen Sie Ressourcen.

Diese Methode eignet sich besonders für Szenarien, in denen eine große Anzahl von Anfragen gleichzeitig verarbeitet werden muss, z. B. Crawlers, Schnittstellenaggregation, CDN -Vorheizen usw.

2 ?? Was ist curl_share_*? Warum es in Kombination verwenden?

Obwohl curl_multi_* gleichzeitige Anforderungen senden kann, ist jeder einfache Handle standardmäßig unabhängig, beispielsweise muss jeder DNs separat auflösen, seine eigenen Cookies usw. verwalten usw. Die Curl_Share_* -Serie von Funktionen ermöglichen mehrere einfache Griffe, um bestimmte interne Ressourcen zu teilen (z.

Zu den Kernschritten gehören:

  1. Verwenden Sie curl_share_init () , um ein gemeinsam genutztes Objekt zu erstellen.

  2. Verwenden Sie curl_share_setopt (), um den gemeinsam genutzten Inhalt (z. B. CurlShopt_Share) festzulegen.

  3. Verwenden Sie curl_setopt ($ ch, curlopt_share, $ share), um ein gemeinsam genutztes Objekt an einen einfachen Griff anzuhängen.

  4. Befreie das freigegebene Objekt nach Abschluss der Anfrage.

3 ?? Vollständiges Beispiel: Gleichzeitige Anfrage + gemeinsamer DNS -Cache

Hier ist ein Beispiel für PHP -Code, das tatsächlich ausgeführt wird:

 <?php

// Gleichzeitige Anfragen sind erforderlichURLListe
$urls = [
    'https://m66.net/api/endpoint1',
    'https://m66.net/api/endpoint2',
    'https://m66.net/api/endpoint3',
    'https://m66.net/api/endpoint4'
];

// Initialisierung multi handle
$multiHandle = curl_multi_init();

// Erstellen Sie ein gemeinsames Objekt
$shareHandle = curl_share_init();
curl_share_setopt($shareHandle, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);

// Lagern Sie jeweils easy handle
$curlHandles = [];

foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SHARE, $shareHandle);
    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[$url] = $ch;
}

// Gleichzeitige Anfragen durchführen
$active = null;
do {
    $mrc = curl_multi_exec($multiHandle, $active);
    if ($mrc == CURLM_CALL_MULTI_PERFORM) {
        continue;
    }
    curl_multi_select($multiHandle);
} while ($active && $mrc == CURLM_OK);

// Ergebnisse sammeln
$responses = [];
foreach ($curlHandles as $url => $ch) {
    $responses[$url] = curl_multi_getcontent($ch);
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

// Schließung multi handle Und share handle
curl_multi_close($multiHandle);
curl_share_close($shareHandle);

// Druckergebnisse
foreach ($responses as $url => $content) {
    echo "Response from $url:\n";
    echo $content . "\n\n";
}

4 ?? Zusammenfassung der wichtigsten Optimierungspunkte

? Verwenden Sie curl_multi_ , um die Parallelitätsleistung zu verbessern *: Initiieren und verarbeiten Sie mehrere Anforderungen gleichzeitig, wodurch die Gesamtzeitverwendung erheblich reduziert wird.
? Verwenden Sie Curl_Share_ , um doppelte Overhead zu speichern *: Durch die Freigabe von Ressourcen wie DNS -Cache, vermeiden Sie doppelte Parsen und verbessern Sie die Gesamteffizienz.
? Hinweis Ressourcenfreigabe : Nach Abschluss der Anforderung können Sie jedes einfache Handle, das Multi -Handle und die Freigabe des Griffs freigeben, da es ansonsten Speicherlecks verursachen kann.
? In Kombination mit curl_multi_select () : Warten Sie auf Netzwerkaktivitäten, um eine CPU -Belegung von 100%zu vermeiden.

5 ?? Anwendbare Szenarien

  • Anfragen mit hoher gleichzeitiger Grenzflächenaggregation.

  • Bulk -Krabbeln einer großen Anzahl von Seiten oder Dateien.

  • Website -Überwachung und Gesundheitsprüfungen.

  • CDN oder Cache Aufwärmen.

Die Verwendung von Curl_Multi_exec () und curl_share_init () kann nicht nur eine echte Parallelität erreichen, sondern auch die doppelte Arbeit durch Ressourcenfreigabe reduzieren, wodurch PHP effizienter und stabiler wird, wenn Sie hochrangige Netzwerkanforderungen bearbeiten.

Wenn Sie in tatsächlichen Anwendungen auf Optimierung Engpässe stoßen, können Sie die Verbindungspooling, Aufgabenplanung, Ausnahmebehandlung und andere Mittel zur Verbesserung der Gesamtlösung weiter kombinieren.