Die Funktion curl_multi_* bietet eine gute Unterstützung bei der Verwendung von Curl -Erweiterungen für gleichzeitige HTTP -Anforderungen in PHP. Insbesondere müssen die beiden Funktionen curl_multi_close und curl_getInfo häufig zusammen verwendet werden, um die Antworten mehrerer Anforderungen zu verarbeiten. In der tatsächlichen Entwicklung können Entwickler jedoch auf einige Fallstricke stoßen, insbesondere wenn sie Curl_getInfo verwenden, um die Antwortinformationen für jede Anforderung zu erhalten. Wenn Sie nicht vorsichtig sind, kann dies zu unerwarteten Fehlern führen oder die richtigen Informationen können nicht erhalten werden.
curl_multi_close wird verwendet, um mehrere Curl -Sitzungsgriffe zu schließen. Nach Abschluss der Anfrage müssen Sie diese Funktion aufrufen, um alle Ressourcen zu befreien. Wenn Sie Curl_getInfo verwenden, um vor dem Schließen der Sitzung die detaillierten Informationen einer Anfrage zu erhalten, können Sie auf ein Problem stoßen: Nach dem Schließen der Sitzung werden die mit diesen Sitzungshandles zugeordneten Ressourcen zerstört, und Sie können nicht die richtigen Antwortinformationen erhalten, indem Sie Curl_getInfo anrufen.
// Beispielcode:Der falsche Weg
$mh = curl_multi_init();
$ch1 = curl_init("https://gitbox.net/api/v1/resource1");
$ch2 = curl_init("https://gitbox.net/api/v1/resource2");
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
do {
$mrc = curl_multi_exec($mh, $active);
} while ($active);
// Fehler:Angerufen, bevor Sie den Sitzungsgriff schließen curl_getinfo
$info1 = curl_getinfo($ch1); // Hier tritt ein Fehler auf,Weil die Sitzung geschlossen wurde
$info2 = curl_getinfo($ch2);
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
Im obigen Beispiel haben wir curl_getInfo vor curl_multi_close angerufen, und die zurückgegebenen Informationen sind nicht mehr verfügbar und können sogar zu PHP -Fehlern führen.
Um die oben genannten Probleme zu vermeiden, sollten Sie Curl_getInfo verwenden, um die Antwortinformationen für jede Anforderung zu erhalten, bevor Sie curl_multi_close aufrufen. Hier ist eine korrekte Demonstration nach der Änderung:
// Die richtige Art, es zu tun
$mh = curl_multi_init();
$ch1 = curl_init("https://gitbox.net/api/v1/resource1");
$ch2 = curl_init("https://gitbox.net/api/v1/resource2");
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
do {
$mrc = curl_multi_exec($mh, $active);
} while ($active);
// richtig:Erhalten Sie Antwortinformationen, bevor Sie die Sitzung schließen
$info1 = curl_getinfo($ch1);
$info2 = curl_getinfo($ch2);
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
// Jetzt können Sie es sicher verwenden $info1 Und $info2 Es ist
In dieser modifizierten Version stellen wir sicher, dass wir vor dem Schließen aller Sitzungshandles die Antwortinformationen für jede Anfrage über Curl_getInfo erhalten. Dadurch wird der Versuch vermieden, nach dem Schließen des Sitzungsgriffs auf die bereits veröffentlichte Ressource zuzugreifen, was zu einem Fehler führt.
Wenn Sie gleichzeitig mehrere Anfragen senden und für jede Anfrage Antwortinformationen abrufen möchten, verwenden Sie normalerweise eine Schleife. Zu diesem Zeitpunkt müssen Sie sicherstellen, dass jedes angeforderte Curl_getInfo vor curl_multi_close erhalten wird, andernfalls wird der Ressourcenverlust auftritt.
// richtig的做法:Verwenden Sie eine Schleife, um Informationen für jede Anfrage einzeln zu erhalten
$mh = curl_multi_init();
$channels = [];
$urls = [
"https://gitbox.net/api/v1/resource1",
"https://gitbox.net/api/v1/resource2"
];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_multi_add_handle($mh, $ch);
$channels[] = $ch;
}
do {
$mrc = curl_multi_exec($mh, $active);
} while ($active);
foreach ($channels as $ch) {
$info = curl_getinfo($ch); // Holen Sie sich hier nacheinander Informationen
// bewältigen $info
}
foreach ($channels as $ch) {
curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
In diesem Beispiel verwenden wir ein Array, um jeden Curl -Sitzungshandle zu speichern und die Antwortinformationen für jede Anforderung einzeln vor curl_multi_close einzeln zu erhalten. Dieser Ansatz vermeidet die zuvor genannten Probleme.
Manchmal werden nicht alle Anfragen gleichzeitig abgeschlossen. Um zu vermeiden, dass Curl_getInfo auf unvollendete Anforderungen angerufen wird, können Sie die Funktion curl_multi_select verwenden, um festzustellen, welche Anforderungen abgeschlossen wurden, und stellen Sie sicher, dass Sie nur curl_getInfo auf abgeschlossenen Anfragen aufrufen.
// Komplexere Situationen:verwenden curl_multi_select bewältigen完成的请求
$mh = curl_multi_init();
$channels = [];
$urls = [
"https://gitbox.net/api/v1/resource1",
"https://gitbox.net/api/v1/resource2"
];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_multi_add_handle($mh, $ch);
$channels[] = $ch;
}
do {
$mrc = curl_multi_exec($mh, $active);
if ($active) {
curl_multi_select($mh); // Warten Sie, um eine Anfrage zu vervollständigen
}
} while ($active);
foreach ($channels as $ch) {
$info = curl_getinfo($ch); // Holen Sie sich hier die ausgefüllten Anfrageinformationen
// bewältigen $info
}
foreach ($channels as $ch) {
curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
Durch die Verwendung von Curl_Multi_Select wird sichergestellt, dass Informationen zu Abschluss der Anfrage zu rechtzeitig erhalten werden, wodurch Datenverlust aufgrund von Warten oder Zeitlimitproblemen vermieden werden.
Bei der Verwendung der Funktion curl_multi_* in PHP werden häufig verwendete Tools verwendet . Der Schlüssel zur Vermeidung häufiger Fallstricke besteht darin, sicherzustellen, dass die Antwortinformationen für jede Sitzung über curl_getInfo erhalten wurden, bevor mehrere Sitzungen geschlossen werden. Mit der richtigen Code -Struktur und der Anforderungsverwaltung können Sie die Stabilität und Korrektheit Ihres Programms sicherstellen.