Die Leistungsoptimierung ist von entscheidender Bedeutung, wenn groß angelegte API-Kriechungsaufgaben ausgeführt werden. Für Entwickler, die PHP und Curl verwenden, kann die rationale Verwendung von Curl_Share_init () den Systemressourcenverbrauch erheblich reduzieren und die Effizienz verbessern. In diesem Artikel wird die Funktion, die Nutzungsszenarien und die korrekte Implementierung im Code ausführlich vorgestellt.
curl_share_init () ist eine Funktion, die durch die PHP -Curl -Erweiterung bereitgestellt wird, um einen gemeinsam genutzten Handle (Curl -Aktienhandle) zu initialisieren. Durch das Teilen von Handeln können Sie Ressourcen wie DNS -Cache, SSL -Sitzungs -Cache, Cookies usw. teilen, zwischen mehreren Curl Easy -Handles, wiederholten Verbindungen oder wiederholten Auflösung von Domänennamen, wodurch die Leistung mehrerer gleichzeitiger Anfragen erheblich verbessert wird.
Kurz gesagt, die Kernfunktion dieser Funktion lautet "Ressourcenfreigabe und reduzierte doppelte Arbeit".
Wenn Sie beispielsweise Hunderte oder Tausende von HTTP -Anfragen gleichzeitig stellen müssen:
Kriechen Sie eine große REST -API -Datenbank;
Synchronisieren Sie regelmäßig mehrere Datenquellen von Drittanbietern;
Greifen Sie auf denselben API -Endpunkt mit hoher Genauigkeit zu.
Wenn jede Anfrage eine DNS -Abfrage und einen SSL -Handschlag separat festlegt, kann dies zu einem enormen Leistungsabfall führen. Durch die Verwendung von Curl_Share_init () kann diese Anfragen teilweise Cache freigeben, wodurch der Overhead reduziert wird.
Hier ist ein Beispielcode zur Optimierung großer API-Crawling-Aufgaben mit Curl_Share_init () :
<?php
// Initialisieren Sie den gemeinsam genutzten Griff
$sh = curl_share_init();
// Legen Sie den gemeinsam genutzten Ressourcentyp fest,Wir teilen hier DNS Und Cookie
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
$urls = [
'https://m66.net/api/data1',
'https://m66.net/api/data2',
'https://m66.net/api/data3',
// Sie können weiterhin mehr hinzufügen API Adresse
];
$multiHandle = curl_multi_init();
$curlHandles = [];
// Initialisieren Sie jeweils cURL easy Handhaben
foreach ($urls as $i => $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 绑定共享Handhaben
curl_setopt($ch, CURLOPT_SHARE, $sh);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[$i] = $ch;
}
// Gleichzeitige Anfragen durchführen
$running = null;
do {
curl_multi_exec($multiHandle, $running);
curl_multi_select($multiHandle);
} while ($running > 0);
// Ergebnisse erhalten
foreach ($curlHandles as $i => $ch) {
$response = curl_multi_getcontent($ch);
echo "Response from {$urls[$i]}:\n";
echo $response . "\n";
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
// Ressourcen frei machen
curl_share_close($sh);
curl_multi_close($multiHandle);
Gemeinsame Ressourceneinstellungen <br> Häufig verwendet , um gemeinsam genutzte Ressourcentypen mit Curl_Share_Setopt () anzugeben, enthalten:
Curl_lock_data_dns : freigegebener DNS -Cache.
Curl_lock_data_cookie : Cookies teilen.
CURL_LOCK_DATA_SSL_SESSION : Teilen Sie die SSL -Sitzung.
Teilen Sie nicht über Prozesse hinweg
Der gemeinsame Griff für Curl gilt nur für denselben Vorgang. Multi-Process Crawling erfordert die Verwendung anderer Mechanismen (wie externen Caches oder Datenbanken).
Ressourcen richtig freigeben <br> Denken Sie daran, dass die Kriechaufgabe vorbei ist, denken Sie daran, curl_share_close () und curl_multi_close ( ) aufzurufen , um Speicherleckage zu vermeiden
Durch das Aktivieren von DNS- und SSL -Sitzungen können Sie vermeiden:
Wiederholen Sie denselben Domänennamen (insbesondere für eine große Anzahl von Anforderungen aus derselben Domäne);
Wiederholen Sie den SSL -Handshake (insbesondere HTTPS -Anforderungen).
Bei tatsächlichen Tests kann diese Optimierung bei Hunderten von gleichzeitigen Anforderungen die CPU und die Netzwerkbelastung erheblich reduzieren und den Gesamtdurchsatz verbessern.