Die Verwendung von CURL für Netzwerkanforderungen in PHP ist eine sehr häufige Praxis, insbesondere wenn Sie mit externen APIs kommunizieren müssen. Wenn Sie jedoch nicht korrekt verwendete Curl -Griffe schließen, kann dies Speicherlecks oder Ressourcenverschwendung verursachen. In diesem Artikel wird ausführlich erläutert, wie die Funktion curl_close korrekt verwendet wird, um sicherzustellen, dass alle offenen Griffe korrekt geschlossen werden, insbesondere bei gleichzeitigen Anforderungen oder Schleifenoperationen.
Im grundlegendsten Nutzungsszenario ist das Schließen des Curl -Griffs relativ einfach:
$ch = curl_init('https://gitbox.net/api/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
Dieser Code schließt den Handle sofort nach Abschluss der Anforderung mit curl_close , was empfohlen wird.
Wenn Sie mehrere Anfragen senden müssen, verwenden Sie normalerweise eine Schleife und es ist einfach, den Schlussgriff zu verpassen:
$urls = [
'https://gitbox.net/api/user/1',
'https://gitbox.net/api/user/2',
'https://gitbox.net/api/user/3',
];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
// Wenn Sie vergessen curl_close($ch),Jede Iteration hinterlässt eine Ressource, die nicht freigegeben wird
}
In diesem Fall muss der Griff nach jeder Iteration manuell geschlossen werden:
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch); // Stellen Sie sicher, dass Sie den Griff schließen
}
Wenn Sie curl_multi_init verwenden, um gleichzeitige Anfragen zu implementieren, muss die Reihenfolge der Schließungsgriffe beachtet werden:
$multiHandle = curl_multi_init();
$curlHandles = [];
$urls = [
'https://gitbox.net/api/task/1',
'https://gitbox.net/api/task/2',
'https://gitbox.net/api/task/3',
];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[] = $ch;
}
// Gleichzeitige Anfragen durchführen
$running = null;
do {
curl_multi_exec($multiHandle, $running);
curl_multi_select($multiHandle);
} while ($running > 0);
// Entfernen und schließen Sie alle Griffe
foreach ($curlHandles as $ch) {
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch); // Hier sind die wichtigsten Schritte zum Ausschalten
}
curl_multi_close($multiHandle);
Beachten Sie, dass Sie hier zusätzlich zu curl_close ($ ch) hier zuerst curl_multi_remove_handle aufrufen müssen, um das Handle zu entfernen, um sicher geschlossen zu werden.
Um zu vermeiden, dass man manuell vergessen, das Griff zu schließen, können Sie den Anforderungsvorgang in einer Funktion einkapseln, um sicherzustellen, dass die Ressource am Ende der Funktion geschlossen ist:
function fetchUrl($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch); // Stellen Sie sicher, dass die Ressource in der Funktion geschlossen ist
return $response;
}
$data = fetchUrl('https://gitbox.net/api/config');
Rufen Sie immer curl_close () an, um das Handle zu schließen , auch wenn die Anforderung fehlschlägt.
Verpassen Sie nicht curl_close, wenn Sie mehrere Handlungs -Parallelität verwenden.
Wenn Sie curl_multi_* verwenden, verwenden Sie zuerst curl_multi_remove_handle und dann curl_close .
In Funktionen so weit wie möglich in Funktionen einbeziehen, um sicherzustellen, dass die Reinigungsarbeiten intern erfolgen, und das Risiko von Auslassungen verringern.
Das korrekte Freisetzung von Ressourcen kann nicht nur die Effizienz und Robustheit des Skripts verbessern, sondern auch das Risiko einer Ressourcenleckage auf dem Server vermeiden. Es ist besonders wichtig in Szenarien, in denen Multi-Thread-oder groß angelegte Anfragen angefordert werden. Mit guten Codierungsgewohnheiten und strukturellen Design kann es leicht sicherstellen, dass jeder Lockengriff korrekt geschlossen ist.