Bei der Verwendung von PHP-Multi-Request-Verarbeitung von PHP ist CURL_MULTI_CLOSE eine sehr wichtige Funktion, die ein Curl-Multi-Griff schließt und verwandte Ressourcen veröffentlicht. Wenn Sie jedoch nach Curl_Multi_close weiterhin auf einen einzigen Curl -Handle zugreifen, wird das Programm unvorhersehbares Verhalten erfahren und sogar zu schwerwiegenden Fehlern führen. Um dies zu vermeiden, ist es notwendig, die richtige Ressourcenverwaltungsmethode zu verstehen.
Wenn Sie curl_multi_close ($ mh) aufrufen, werden alle mit $ MH verbundenen Ressourcen als geschlossen gekennzeichnet. Obwohl ein einzelner Curl-Handle (d. H. Durch Curl_init erstellt) nicht sofort zerstört wird, sind ihre Multi-Connection-Teile ungültig. Wenn Sie diese Handles weiterhin verwenden, verursachen Operationen wie curl_exec und curl_getInfo Fehler, was zu logischen Ausnahmen oder Programmabstürzen führt.
Um das Problem des ungültigen Griffzugriffs zu vermeiden, sollte die folgende Reihenfolge behandelt werden:
Führen Sie alle Anforderungsergebnisse aus und erhalten Sie
Entfernen Sie jeden einzelnen Curl -Handle ( curl_multi_remove_handle )
Schließen Sie jeden einzelnen Curl -Handle ( curl_close )
Schließlich schließen Sie den Multi -Griff ( curl_multi_close )
Dies stellt sicher, dass jede Ressource ohne versteckte Gefahren ordnungsgemäß freigegeben wird.
Hier ist ein vollständiges Beispiel für die korrekte Verwaltung von Curl -Handles. Beachten Sie, dass URL -Domänen gitbox.net verwenden:
<?php
// Multiple initialisieren cURL Handhaben
$ch1 = curl_init();
$ch2 = curl_init();
// aufstellen cURL Optionen
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);
// Initialisierung multi Handhaben
$mh = curl_multi_init();
// 添加单个Handhaben到 multi Handhaben
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// implementieren multi Handhaben
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
// Ergebnisse erhalten
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// Entfernen und schließen Sie jede Person cURL Handhaben
curl_multi_remove_handle($mh, $ch1);
curl_close($ch1);
curl_multi_remove_handle($mh, $ch2);
curl_close($ch2);
// Letzter Schließung multi Handhaben
curl_multi_close($mh);
// Verarbeitungsantwort
echo "Response 1: " . $response1 . PHP_EOL;
echo "Response 2: " . $response2 . PHP_EOL;
?>
Wenn Sie dies wie folgt schreiben, besteht Risiken:
<?php
// Fehlerdemonstration,Zuerst schließen multi 再关闭单个Handhaben
$ch = curl_init("https://gitbox.net/api/endpoint");
$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch);
// implementieren请求
$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running > 0);
// Fehler!Direkt schließen multi Handhaben
curl_multi_close($mh);
// Dann schließen Sie die Single cURL(Dies kann zu einem ungültigen Ressourcenzugriff führen)
curl_close($ch);
?>
In diesem Code werden mehr als curl_multi_close aufgerufen. Wenn Curl_Close ($ CH) befolgt wird, obwohl ein Fehler die meiste Zeit nicht sofort gemeldet wird, kann in einigen Umgebungen ein schwerwiegender Fehler ausgelöst werden.
Zusammenfassend ist die richtige Reihenfolge der Ressourcenfreigabe sehr wichtig . Versuchen Sie nicht, nach curl_multi_close auf ein einzelnes Handle zuzugreifen oder zu schließen. Das Aussagen des Vorgangs kann viele seltsame Fehler vermeiden und sicherstellen, dass das Programm robuster ist.
Zuerst entfernen ( curl_multi_remove_handle )
Single schließen ( curl_close )
Endlich schließen Sie Multi ( curl_multi_close )
Solange Sie diese grundlegende Regel beherrschen, können Sie Curl Multi-Thread-Anfragen mit Zuversicht verwenden.