Curl ist ein sehr leistungsstarkes Tool, wenn sie PHP für Netzwerkanforderungen verwenden. Viele Entwickler stoßen jedoch auf ein häufiges Problem, wenn mehrere Anfragen verarbeitet oder Daten wiederverwendet werden:
Um dieses Problem zu verstehen, müssen wir mit dem internen Mechanismus und dem Ressourcenmanagement von Curl beginnen.
Curl verwendet einen Mechanismus, der als "Griff" bezeichnet wird, um den Kontext der Anfrage zu erhalten. Wenn wir curl_init () aufrufen, erstellt PHP eine Ressource, nämlich das "Handle", mit dem die HTTP -Anforderung erstellt wird. Verwenden Sie dann curl_setopt (), um verschiedene Parameter festzulegen, und führen Sie die Anforderung schließlich über curl_exec () aus.
Hier ist ein typischer Curl -Anforderungsprozess:
$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);
Der Zweck von curl_close () besteht darin, Ressourcen zu veröffentlichen, die zuvor über curl_init () erstellt wurden. Das heisst:
Die Verbindung ist geschlossen;
Alle Einstellungen (einschließlich URLs, Anforderungsheader usw.) werden zerstört.
Alle internen Puffer (einschließlich Antwortkörper), die sich auf die Anfrage beziehen, werden ebenfalls gereinigt.
Sobald Sie Curl_Close () aufrufen, ist es daher gleichbedeutend damit, den von der Curl -Anforderung verwendeten Kontext vollständig zu zerstören. Selbst wenn Sie die Antwortvariablen zuvor gespeichert haben, können Sie möglicherweise nicht mehr auf einige spezifische interne Daten (z. B. die Übertragungsinformationen im ursprünglichen Handle usw.) zugreifen, da einige Ressourcen veröffentlicht werden.
Zum Beispiel:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
// Versuchen Sie nun, die Anfrageinformationen zu erhalten
$info = curl_getinfo($ch); // Dies wird scheitern,$ch Ungültig
Im obigen Beispiel kann curl_getInfo () nicht mehr verwendet werden, da $ CH geschlossen und gelöscht wurde.
Wenn Sie nach dem Schließen der Verbindung die Antwortdaten beibehalten müssen, können Sie die erforderlichen Daten vor dem Schließen des Handels extrahieren. Zum Beispiel:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/user/profile");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
// Jetzt $response Und $info Alle sind sicher
Solange Sie alles extrahieren, was Sie vor curl_close () benötigen, ist das Schließen der Verbindung völlig in Ordnung.
Für gleichzeitige Anfragen oder Hochleistungsszenarien können Sie in Betracht ziehen, curl_multi_init () zu mehreren Griffen oder mithilfe der persistenten Verbindungstechnologie (Keep-Alive) -Technologie zu verwenden. PHP unterstützt auch HTTP -Clients wie Guzzle, die das Verbindungs -Multiplexing und das Ressourcenmanagement intelligenter verarbeiten.
Nachdem curl_close () aufgerufen wurde, werden alle Kontexte und Ressourcen von Curl veröffentlicht, was die Hauptursache ist, die Sie die vorherigen angeforderten Daten nicht mehr übertragen oder abrufen können. Der korrekte Ansatz besteht darin, den erforderlichen Antwortinhalt zu extrahieren oder Informationen anzufordern, bevor die Verbindung geschlossen wird. Das Verständnis des Ressourcenlebenszyklus von Curl hilft uns, ihn sicherer und effizienter für die HTTP -Kommunikation zu verwenden.