Aktueller Standort: Startseite> Neueste Artikel> Verwenden Sie curl_multi_close, um ein wiederholtes Schließen von Verbindungen in asynchronen Anforderungen zu vermeiden

Verwenden Sie curl_multi_close, um ein wiederholtes Schließen von Verbindungen in asynchronen Anforderungen zu vermeiden

gitbox 2025-05-13

In PHP ist Curl eine leistungsstarke Bibliothek, mit der wir Anforderungen über mehrere Protokolle wie HTTP, HTTPS, FTP usw. senden können. Die Funktion von Curl_Multi_* ermöglicht es uns, mehrere asynchrone Anfragen gleichzeitig auszustellen, wodurch die Leistung verbessert und die Anfragedauer verkürzt werden kann. Asynchrone Anfragen sind sehr nützlich, insbesondere wenn mehrere HTTP -Anforderungen erforderlich sind.

Bei Verwendung der Funktion curl_multi_* für asynchrone Anforderungen gibt es jedoch eine gemeinsame Falle: wiederholtes Schließen von Verbindungen . Wenn wir eine Curl -Sitzung durch die Funktion curl_multi_close schließen, können einige Verbindungen wiederholt geschlossen werden, bevor sie nicht ordnungsgemäß geschlossen sind, was zu einem Fehler oder Speicherleck führt.

In diesem Artikel werden Sie angezeigt, wie Sie in PHP ordnungsgemäß CURL_MULTI_CLOSE verwenden, um asynchrone Anforderungen zu verwalten und wiederholtes Schließen von Verbindungen zu vermeiden.

1. Grundlegende Schritte zur Verwendung von curl_multi_* Funktion

Schauen wir uns zunächst an, wie die Funktion curl_multi_* PHP mehrere asynchrone Anforderungen initiiert. Hier ist ein grundlegendes Beispiel:

 <?php
// Multiple erstellen cURL Sitzung
$ch1 = curl_init();
$ch2 = curl_init();

// aufstellen cURL Anfrageoptionen
curl_setopt($ch1, CURLOPT_URL, 'https://gitbox.net/api/endpoint1');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_URL, 'https://gitbox.net/api/endpoint2');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

// erstellen cURL Mehrere Griffe
$mh = curl_multi_init();

// Legen Sie jeweils ein cURL Sitzung加入Mehrere Griffe
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// Asynchrone Anfragen durchführen
do {
    $status = curl_multi_exec($mh, $active);
} while ($active);

// Holen Sie sich das Ergebnis jeder Anfrage
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);

// Ausgangsergebnis
echo "Response 1: " . $response1 . "\n";
echo "Response 2: " . $response2 . "\n";

// 关闭Sitzung
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
curl_close($ch1);
curl_close($ch2);
?>

In diesem Beispiel erstellen wir zwei Curl -Sitzungen und richten die Anforderungs -URL ein und verwenden die Funktion curl_multi_* , um zwei asynchrone Anforderungen gleichzeitig auszustellen. curl_multi_exec wird ausgeführt, bis alle Anforderungen abgeschlossen sind. Dann verwenden wir curl_multi_getContent, um das Rückgabeergebnis zu erhalten und schließlich alle Sitzungen zu schließen.

2. Vermeiden Sie wiederholtes Schließen von Verbindungen

Im obigen Code haben wir curl_multi_close verwendet, um Curl-Multi-Griffe zu schließen und Curl_Close zu schließen, um jede einzelne Curl-Sitzung zu schließen. Dies ist eine gängige Praxis, aber es ist zu beachten, dass Curl_Multi_Close nur für das Schließen mehrerer Griffe verantwortlich ist und nicht jeden Sitzungsgriff schließt. Nach dem Schließen von curl_multi_close muss jeder curl_close noch über curl_close geschlossen werden.

Problem: Wenn Sie in einigen Fällen wiederholt Curl_close oder curl_multi_close aufrufen, haben Sie möglicherweise das Problem des wiederholten Schließens der Verbindung. Um dies zu vermeiden, können wir zwei Methoden annehmen:

  1. Stellen Sie sicher, dass jeder Griff nur einmal geschlossen ist <br> Während der Schleifen oder der Verarbeitung können wir versehentlich bestimmte Sitzungen wiederholt schließen. Um dieses Problem zu vermeiden, können Sie beim Schließen eine Marke machen und sicherstellen, dass jeder Griff nur einmal geschlossen ist.

  2. Entfernen Sie zuerst den Griff und schließen Sie ihn dann <br> Verwenden Sie curl_multi_remove_handle , um den Griff zu entfernen, und versichern Sie, dass jeder Griff bei geschlossenen Handeln von den mehreren Griffen entfernt wird. Dies vermeidet die geschlossenen Griffe, die angezeigt werden, wenn curl_multi_close aufgerufen wird.

3.. Verbesserte Codebeispiele

Um wiederholtes Schließen von Verbindungen zu vermeiden, haben wir den Code verbessert:

 <?php
// Multiple erstellen cURL Sitzung
$ch1 = curl_init();
$ch2 = curl_init();

// aufstellen cURL Anfrageoptionen
curl_setopt($ch1, CURLOPT_URL, 'https://gitbox.net/api/endpoint1');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_URL, 'https://gitbox.net/api/endpoint2');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

// erstellen cURL Mehrere Griffe
$mh = curl_multi_init();

// Legen Sie jeweils ein cURL Sitzung加入Mehrere Griffe
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// Asynchrone Anfragen durchführen
do {
    $status = curl_multi_exec($mh, $active);
} while ($active);

// Holen Sie sich das Ergebnis jeder Anfrage
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);

// Ausgangsergebnis
echo "Response 1: " . $response1 . "\n";
echo "Response 2: " . $response2 . "\n";

// 移除句柄后再关闭Sitzung
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);

// Richtig schließen
curl_multi_close($mh);
curl_close($ch1);
curl_close($ch2);
?>

4. Zusammenfassung

  1. Verwenden Sie die Funktion curl_multi_* , um mehrere asynchrone Anforderungen zur Verbesserung der Leistung effektiv zu initiieren.

  2. Verwenden Sie beim Schließen einer Curl -Sitzung unbedingt curl_multi_remove_handle , um die Sitzung zu entfernen, und rufen Sie dann curl_multi_close auf.

  3. Jede Curl -Sitzung sollte vor dem Schließen über curl_close geschlossen werden, um wiederholtes Schließen in curl_multi_close zu vermeiden.

Durch korrektes Verwalten des Verschlusss von Verbindungen können wir wiederholte Verschlüsse von Verbindungen vermeiden, um sicherzustellen, dass der Code stabiler und effizienter ist.