Bei der Curl -Bibliothek von PHP zur Erstellung von Netzwerkanforderungen wird die Funktion curl_share_init () verwendet, um einen gemeinsam genutzten Griff zu initialisieren, sodass mehrere Curl -Sitzungen Ressourcen wie DNS -Caches, Cookies usw. teilen können. Dies hilft, Ressourcen zu sparen und die Effizienz in hohen Gleichzeitverkehrsumgebungen zu verbessern. Viele Entwickler können jedoch bei der Verwendung von Curl_Share_init () gemeinsam auf Ausfallprobleme stoßen.
In diesem Artikel werden Sie verstehen, wie Sie die durch curl_share_init verursachten Freigabestörungen durch die beiden Debugging -Tools curl_error () und curl_errno () finden und lösen können.
Curl_Share_init () wird verwendet, um ein gemeinsam genutztes Handle zu erstellen, das normalerweise in Verbindung mit curl_share_setopt () verwendet wird, um die Art der zu gemeinsam genutzten Ressource zu definieren. Schließlich müssen Sie Curl_Share_Close () verwenden, um den Griff zu veröffentlichen.
Einfaches Beispiel:
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
Wenn sie jedoch falsch konfiguriert oder falsch verwendet werden, können einige Freigabemaßnahmen fehlschlagen, was sich als Anforderungsausnahmen, Datenverwirrung oder sogar Abstürze manifestiert.
Häufige Ursachen des Versagens sind:
Verwenden Sie den gleichen Lockengriff in verschiedenen Threads.
Wiederholen Sie den gemeinsam genutzten Griff oder können Sie wiederholt handeln.
Die Set -Sharing -Typen (z. B. Cookie, DNS) werden unten nicht unterstützt.
Die Libcurl -Version ist unvereinbar.
Um spezifische Fehler zu finden, müssen wir curl_error () und curl_errno () verwenden.
Diese beiden Funktionen sind der Kern des Debuggens von Curl -Fehler:
Curl_error ($ CH) gibt die Fehlermeldung (in Zeichenfolgenform) der letzten Curl -Operation zurück.
curl_errno ($ ch) gibt den Fehlercode (numerische Formular) der letzten Curl -Operation zurück.
Sie werden normalerweise zusammen verwendet:
$ch = curl_init('https://m66.net/api/test');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if ($result === false) {
echo 'cURL Error Code: ' . curl_errno($ch) . "\n";
echo 'cURL Error Message: ' . curl_error($ch) . "\n";
} else {
echo 'Request successful: ' . $result;
}
curl_close($ch);
Für gemeinsame Griffe:
$sh = curl_share_init();
if ($sh === false) {
die("Failed to initialize curl share handle.\n");
}
$setopt_result = curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
if ($setopt_result === false) {
echo "Failed to set share option.\n";
}
$ch = curl_init('https://m66.net/api/test');
curl_setopt($ch, CURLOPT_SHARE, $sh);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if ($result === false) {
echo 'cURL Error Code: ' . curl_errno($ch) . "\n";
echo 'cURL Error Message: ' . curl_error($ch) . "\n";
} else {
echo 'Request successful: ' . $result;
}
curl_close($ch);
curl_share_close($sh);
Fehlercode | Häufige Gründe |
---|---|
1 | Curle_unsupported_protocol |
3 | Curle_url_Malformat |
5 | Curle_Couldnt_resolve_proxy |
6 | Curle_Couldnt_resolve_host |
7 | Curle_couldnt_connect |
Dreiundzwanzig | Curle_Write_error |
43 | Curle_bad_function_argument |
81 | Curle_share_in_use |
Für Curle_Share_in_use bedeutet dies, dass das aktuelle gemeinsame Griff von einem anderen Handle verwendet wird und nicht gleichzeitig konfiguriert oder freigegeben werden kann. Die Codelogik muss überprüft werden.
1 ?? Bestätigen Sie, dass die Libcurl -Version unterstützt , dass Sie die aktuell unterstützten Funktionen überprüfen können.
2 ?? Um den Umfang des Problems zu trennen, verwenden Sie zunächst einen einzelnen Curl -Griff, um es zu testen, und stellen Sie dann einen gemeinsam genutzten Griff ein, um zu bestätigen, dass es sich um ein durch Aktien verursachtes Problem handelt.
3 ?? Verwenden Sie curl_error () und curl_errno (), um detaillierte Fehler zu erhalten, die unmittelbar nach curl_exec () überprüft werden müssen.
4 ?? Aktivieren Sie detaillierte Protokolle durch curlopt_verbose :
curl_setopt($ch, CURLOPT_VERBOSE, true);
5 ?? Überprüfen Sie die Gewindesicherheit nicht in mehreren Threads, es sei denn, libcurl wird mit Gewinde zusammengestellt.