Bei Verwendung der Curl -Erweiterung von PHP kann die Funktionserie von Curl_Multi_* mehrere HTTP -Anforderungen gleichzeitig ausführen. Senden Sie Anforderungen in Stapeln über curl_multi_exec () und schließen Sie den Handle mithilfe von curl_multi_close () . Obwohl diese Funktionen leistungsstark sind, sind sie in Verbindung mit curl_setopt () anfällig für einige Fallstricke. Im Folgenden werden wir einige häufige Fehler diskutieren und sie vermeiden.
Bei Verwendung von curl_multi_exec () , um mehrere Anforderungen zu verarbeiten, müssen in der Regel individuelle Optionen für jede Anforderung festgelegt werden. Wenn curl_setopt () beim Hinzufügen mehrerer Handles nicht korrekt eingestellt ist, kann die Anforderung fehlschlagen oder falsche Ergebnisse zurückgeben.
$ch1 = curl_init();
$ch2 = curl_init();
curl_setopt($ch1, CURLOPT_URL, 'https://gitbox.net/api/data1');
curl_setopt($ch2, CURLOPT_URL, 'https://gitbox.net/api/data2');
// Ich habe vergessen, andere notwendige Optionen festzulegen,wie CURLOPT_RETURNTRANSFER
Stellen Sie sicher, dass Sie die erforderlichen Optionen für jeden Curl -Griff einstellen. Zum Beispiel:
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_multi_close () und curl_close () werden beide verwendet, um Curl -Griffe zu schließen, aber ihr Aktionsumfang ist unterschiedlich. curl_close () schließt nur einen einzelnen Curl -Handle, während curl_multi_close () alle Griffe in einer mehrfachen Curl -Anforderung schließt. Wenn Sie diese beiden Funktionen falsch verwenden, kann die Ressource nicht korrekt freigegeben werden, oder das Programm hat eine Ausnahme in nachfolgenden Anfragen.
curl_multi_close($multiHandle); // Fehler,Weil $multiHandle Mehrere Griffe müssen geschlossen werden
Bei Verwendung mehrerer Anforderungen müssen Sie curl_multi_close () verwenden, um mehrere Griffe zu schließen, nachdem Sie die Anforderung abgeschlossen und jeden Handle verarbeitet haben:
// Mehrere Anfragen ausführen
curl_multi_exec($multiHandle, $running);
// Schließen Sie jeden Einzelnen cURL Handhaben
curl_close($ch1);
curl_close($ch2);
// Richtig verwenden curl_multi_close()
curl_multi_close($multiHandle);
Manchmal, wenn ein Entwickler curl_multi_exec () verwendet, um mehrere Anforderungen zu senden, können er die Verbindung vorzeitig schließen, da er nicht korrekt wartet, bis die Anforderung korrekt abgeschlossen ist. Da curl_multi_exec () asynchron ausgeführt wird, muss sichergestellt werden, dass alle Anfragen abgeschlossen wurden und dann curl_multi_close () aufrufen.
// 没有等待请求完成就关闭Handhaben
curl_multi_close($multiHandle);
Stellen Sie durch Erkennung des Parameters $ Running sicher, dass alle Anfragen vor dem Schließen der Verbindung abgeschlossen sind:
$running = null;
do {
curl_multi_exec($multiHandle, $running);
} while ($running > 0);
curl_multi_close($multiHandle);
In einigen Fällen können Entwickler versuchen, denselben Curl -Handle wiederzuverwenden, was leicht zu Anforderungsfehlern oder Leistungsproblemen führen kann. Jedes Mal, wenn eine neue Anfrage gesendet wird, sollte ein neuer Curl -Handle erstellt und verschiedene Optionen festgelegt werden.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://gitbox.net/api/data1');
// 复用相同的Handhaben
curl_setopt($ch, CURLOPT_URL, 'https://gitbox.net/api/data2'); // Fehler,应该创建新的Handhaben
Stellen Sie sicher, dass Sie für jede Anfrage einen neuen Curl -Handle erstellen:
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, 'https://gitbox.net/api/data1');
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, 'https://gitbox.net/api/data2');
Wenn curl_multi_exec () eine Anforderung ausführt, können verschiedene Netzwerk- oder Serverfehler auftreten. Um diese Fehler korrekt behandeln zu können, sollten curl_error () und curl_errno () zum Fehler -Debuggen verwendet werden.
curl_multi_exec($multiHandle, $running); // Eine Anfrage ausführen,但没有处理Fehler
Überprüfen und geben Sie die Fehlermeldung nach, nachdem jede Anforderung abgeschlossen ist:
// Eine Anfrage ausführen
curl_multi_exec($multiHandle, $running);
// Fehler处理
foreach ($handles as $ch) {
if ($errno = curl_errno($ch)) {
echo "cURL error: " . curl_error($ch);
}
}