In PHP bieten die Funktionserie von CURL_MULTI_* die Möglichkeit, asynchron gleichzeitige Anforderungen zu erhalten, die normalerweise in Verbindung mit curl_multi_add_handle und curl_multi_exec verwendet werden. Wenn Sie CURL_MULTI_ADD_HANDLE verwenden, um mehrere Curl -Griffe zu Multi -Griffen hinzuzufügen, kann CURL_MULTI_REMOVE_HANDLE jeden Handle aus dem Multi -Handle entfernen, nachdem die Anforderung abgeschlossen ist.
$multiCurl = curl_multi_init();
$curlHandles = [];
// Mehrfach hinzufügencurlHandle mitmultiIm Griff
for ($i = 0; $i < 5; $i++) {
$curlHandles[$i] = curl_init("http://gitbox.net/api/data$i");
curl_multi_add_handle($multiCurl, $curlHandles[$i]);
}
// Eine Anfrage ausführen
do {
$status = curl_multi_exec($multiCurl, $active);
} while ($active);
// Entfernen Sie jeden Griff
foreach ($curlHandles as $ch) {
curl_multi_remove_handle($multiCurl, $ch);
curl_close($ch);
}
curl_multi_close($multiCurl);
Im obigen Code entfernen wir jeden Curl -Handle über curl_multi_remove_handle . Obwohl sichergestellt wird, dass die Ressourcen korrekt veröffentlicht werden, können häufige Aufrufe an curl_multi_remove_handle in einer Schleife einen gewissen Leistungsaufwand verursachen, insbesondere wenn die Anzahl der Anforderungen hoch ist.
Beim Aufrufen von CURL_MULTI_REMOVE_HANDLE muss PHP den Status des Multi -Handels unten aktualisieren. Dies ist ein relativ zeitaufwändiger Betrieb, insbesondere wenn die Anzahl der gleichzeitigen Anforderungen groß ist. Wenn jede Anfrage abgeschlossen ist, wird das Handle entfernt, PHP muss die Statusinformationen des Multi-Thread-Threads verarbeiten und aktualisieren. Das häufige Entfernen von Griffen kann die folgenden Leistungsprobleme verursachen:
Häufige Speicherverwaltung : Beim Entfernen von Handles muss der zugrunde liegende Speicherverwaltungsmechanismus Ressourcen neu zuordnen, was zu einer Überkopf -Speicherzuweisung und -freigabe führt.
Sperr- und Threadsynchronisation : CURL_MULTI_REMOVE_HANDLE beinhaltet Thread -Sperrvorgänge, wenn sie parallel anfordern. Häufige Anrufe können zu einem Sperrwettbewerb führen und die Ausführungseffizienz weiter verringern.
Komplexität des Anrufstacks : Jeder Anruf erhöht die Tiefe des Stapels, insbesondere bei hoher Parallelität, wobei der Anstieg des Call -Stacks die Gesamtleistung beeinträchtigen kann.
Die Optimierung dieser Vorgänge ist daher sehr wichtig, um die Leistung zu verbessern, insbesondere wenn häufige gleichzeitige Anfragen erforderlich sind.
Anstatt curl_multi_remove_handle unmittelbar nach Abschluss jeder Anfrage anzurufen, können wir den Griff einheitlich entfernen, nachdem alle Anforderungen abgeschlossen sind. Dies kann häufige Ressourcenaktualisierungen vermeiden und Leistungsverluste verringern.
$multiCurl = curl_multi_init();
$curlHandles = [];
// Mehrfach hinzufügencurlHandhaben
for ($i = 0; $i < 5; $i++) {
$curlHandles[$i] = curl_init("http://gitbox.net/api/data$i");
curl_multi_add_handle($multiCurl, $curlHandles[$i]);
}
// Gleichzeitige Anfragen durchführen
do {
$status = curl_multi_exec($multiCurl, $active);
} while ($active);
// 统一移除所有Handhaben
foreach ($curlHandles as $ch) {
curl_multi_remove_handle($multiCurl, $ch);
curl_close($ch);
}
curl_multi_close($multiCurl);
Durch das gleichmäßige Entfernen der Griffe, nachdem alle Anfragen abgeschlossen sind, können unnötige Zwischenoperationen reduziert und die Leistung verbessert werden.
In einigen Szenarien können wir die Anzahl der Anrufe an curl_multi_remove_handle reduzieren, indem wir die Anzahl der gleichzeitigen Anforderungen anpassen. Zum Beispiel die Batch -Verarbeitung aller Anfragen und dann den Griff entsprechend nach Abschluss der Stapel einheitlich entfernen.
$multiCurl = curl_multi_init();
$curlHandles = [];
// Nehmen Sie eine Verarbeitung an10Eine Bitte
$batchSize = 10;
for ($i = 0; $i < 100; $i++) {
$curlHandles[$i] = curl_init("http://gitbox.net/api/data$i");
curl_multi_add_handle($multiCurl, $curlHandles[$i]);
if (count($curlHandles) == $batchSize) {
// Gleichzeitige Anfragen durchführen
do {
$status = curl_multi_exec($multiCurl, $active);
} while ($active);
// 统一移除当前批次的所有Handhaben
foreach ($curlHandles as $ch) {
curl_multi_remove_handle($multiCurl, $ch);
curl_close($ch);
}
// 清空当前批次的Handhaben数组
$curlHandles = [];
}
}
// Wenn noch Anfragen übrig sind,Weiter verarbeiten
if (count($curlHandles) > 0) {
do {
$status = curl_multi_exec($multiCurl, $active);
} while ($active);
// 统一移除剩余Handhaben
foreach ($curlHandles as $ch) {
curl_multi_remove_handle($multiCurl, $ch);
curl_close($ch);
}
}
curl_multi_close($multiCurl);
Durch die Verarbeitung von Anfragen kann die Anzahl der Anrufe von curl_multi_remove_handle stark reduziert werden, wodurch die Leistung verbessert wird.
Wenn Sie in einigen Fällen häufig die gleichen API-Aufrufe tätigen, können Sie in Betracht ziehen, http persistente Verbindungen (Keep-Alive) zu aktivieren. Dies führt dazu, dass sich Curl mehrmals auf derselben Verbindung anfragt, anstatt jedes Mal eine neue Verbindung herzustellen, wodurch viel Verbindungsaufwand und häufige Anrufe an curl_multi_remove_handle reduziert werden.
Sie können die Wiederverwendung von Verbindungen deaktivieren, indem Sie curlopt_forbid_reuse auf True einstellen, um sicherzustellen, dass für jede Anforderung eine neue Verbindung verwendet wird. Das Aufhalten von Verbindungsmultiplexen verbessert normalerweise die Leistung ohne besondere Bedürfnisse.
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Connection: keep-alive',
]);
Durch beständige Verbindungen wird die Häufigkeit der Erstellung und Zerstörung von Verbindungen verringert, wodurch die Leistung verbessert wird.
Wenn Ihr Anforderungsvolumen sehr groß ist, ist PHP Curl möglicherweise nicht die beste Wahl. In diesem Fall erwägen Sie, fortgeschrittenere gleichzeitige Anforderungsmethoden zu verwenden, z .