Aktueller Standort: Startseite> Neueste Artikel> Wie kann man Multi -Curl -Anfragen in PHP richtig behandeln und mit curl_close enden?

Wie kann man Multi -Curl -Anfragen in PHP richtig behandeln und mit curl_close enden?

gitbox 2025-05-18

In PHP ist Curl eine leistungsstarke Bibliothek für die Ausführung von Netzwerkanforderungen wie dem Zugriff auf REST -APIs oder kriechende Webseiten. Bei der Verarbeitung einer einzelnen Curl -Anforderung wird der Standardprozess mit Curl_init () , curl_exec () die Anforderung ausführen und schließlich die Ressource über curl_close () initialisieren. Bei der Behandlung mehrerer gleichzeitiger Anfragen, insbesondere bei der Verwendung von Curl_Multi_* -Serienfunktionen, ist es besonders wichtig, Ressourcen ordnungsgemäß zu schließen und zu reinigen. Andernfalls kann dies zu Speicherlecks oder Netzwerkverbindungsproblemen führen.

1. Überprüfung des grundlegenden Curl -Anfrageprozesses

In einer einzigen Anfrage lautet der typische Code wie folgt:

 $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://gitbox.net/api/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch); // Ressourcen korrekt freigeben

Hier ist curl_close ($ ch) erforderlich. Es schließt den von curl_init () erstellten Curl -Handle und befreit die relevanten Ressourcen.

2. Häufige Möglichkeiten, mehrere Anfragen zu bearbeiten

Für Szenarien, in denen mehrere Anfragen erforderlich sind, um mehrere Anforderungen gleichzeitig zu initiieren, bietet PHP eine Schnittstelle curl_multi_* . Beispiele sind wie folgt:

 $urls = [
    'https://gitbox.net/api/one',
    'https://gitbox.net/api/two',
    'https://gitbox.net/api/three',
];

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

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

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

// Ergebnisse erhalten
$responses = [];
foreach ($curlHandles as $ch) {
    $responses[] = curl_multi_getcontent($ch);
}

Zu diesem Zeitpunkt wird die Ressource nicht veröffentlicht, wenn Sie nicht den nächsten Schritt curl_multi_remove_handle und curl_close ausführen.

3.. Veröffentlichen Sie mehrere angeforderte Ressourcen korrekt frei

Nachdem alle Anfragen ausgeführt und die Antwort abgerufen wurden, muss jeder Griff gereinigt werden:

 foreach ($curlHandles as $ch) {
    curl_multi_remove_handle($multiHandle, $ch); // aus multi handle Eingenommen
    curl_close($ch); // Eine Single schließen cURL Handhaben,Ressourcen frei machen
}

curl_multi_close($multiHandle); // Letzter Schließung multi handle

Dies ist ein kritischer Schritt, um sicherzustellen, dass alle Ressourcen veröffentlicht werden. Es reicht nicht aus, CURL_MULTI_CLOSE () einfach auszuschalten, ohne curl_close () nacheinander aufzurufen.

4. Best Practices und Vorschläge

  1. Immer explizit freigeben : Ob es sich um eine einzelne oder mehrere Anforderungen handelt, denken Sie immer daran, curl_close () zu verwenden.

  2. Verwenden Sie Try-Final- oder Fehlerbehandlungen : Möglicherweise gibt es Ausnahmen während der Verarbeitung. Es wird empfohlen, die Versuchsstruktur zu verwenden, um sicherzustellen, dass der Griff endgültig freigegeben wird.

  3. Überwachen Sie Speicher und Verbindungszahl : In Umgebungen mit hoher Genauigkeit können unveröffentlichte Curl -Griffe schnell zu Ressourcenschöpfung führen.

  4. Logik der Kapselungsanforderung : Es wird empfohlen, sie in eine Funktion oder Klasse zu verkapulieren, um die Ressourcenfreigabe intern zu verarbeiten, um Auslassungen zu vermeiden.

5. Zusammenfassung

curl_close () ist in PHP nicht optional, insbesondere in mehreren Anforderungsszenarien. Richtige Verwendung von curl_multi_remove_handle () und curl_close () kann die Systemstabilität und -leistung sicherstellen. Vergessen Sie nach dem Schreiben der Anforderungslogik diesen Schritt nicht: Die rechtzeitige Reinigung von Ressourcen ist die beste Leistungsoptimierung.