Lorsque vous utilisez la bibliothèque Curl de PHP pour faire des demandes de réseau, la fonction Curl_share_Init () est utilisée pour initialiser une poignée partagée afin que plusieurs sessions Curl puissent partager des ressources, telles que les caches DNS, les cookies, etc. Cependant, de nombreux développeurs peuvent rencontrer des problèmes de défaillance de partage lors de l'utilisation de curl_share_init () , qui est souvent lié aux conflits de ressources, aux erreurs de configuration ou aux problèmes de bibliothèques sous-jacentes (libcurl).
Cet article vous amènera à comprendre comment localiser et résoudre les problèmes de défaillance de partage causés par Curl_share_Init via les deux outils de débogage , curl_error () et curl_errno () .
curl_share_init () est utilisé pour créer une poignée partagée, qui est généralement utilisée en conjonction avec curl_share_setopt () pour définir le type de ressource à partager. Enfin, vous devez utiliser curl_share_close () pour libérer la poignée.
Exemple simple:
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
Cependant, s'ils sont configurés ou utilisés de manière incorrecte, certaines opérations de partage peuvent échouer, se manifester en tant qu'exceptions de demande, confusion de données ou même plantages.
Les causes de défaillance courantes comprennent:
Utilisez la même poignée de boucle dans différents threads;
Répétez la poignée ou la poignée partagée à plusieurs reprises;
Les types de partage des ensembles (tels que les cookies, DNS) ne sont pas pris en charge en bas;
La version libcurl est incompatible.
Pour localiser des erreurs spécifiques, nous devons utiliser curl_error () et curl_errno () .
Ces deux fonctions sont le cœur du débogage des erreurs de boucle:
Curl_error ($ ch) renvoie le message d'erreur (sous forme de chaîne) de la dernière opération Curl;
Curl_errno ($ ch) renvoie le code d'erreur (formulaire numérique) de la dernière opération Curl.
Ils sont généralement utilisés ensemble:
$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);
Pour les poignées partagées:
$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);
Code d'erreur | Raisons courantes |
---|---|
1 | Curle_unsupported_protocol |
3 | Curle_url_malformat |
5 | Curle_Couldnt_Resolve_Proxy |
6 | Curle_Couldnt_resolve_host |
7 | Curle_Couldnt_Connect |
vingt-trois | Curle_write_error |
43 | Curle_bad_function_argument |
81 | Curle_share_in_use |
Pour Curle_Share_in_Use , cela signifie que la poignée partagée actuelle est utilisée par une autre poignée et ne peut pas être configurée ou libérée en même temps. La logique de code doit être vérifiée.
1 ?? Confirmez que la version LibCurl prend en charge, vous pouvez utiliser Curl_version () pour vérifier les fonctionnalités actuellement prises en charge.
2 ?? Pour séparer la portée du problème, utilisez d'abord une seule poignée de boucle pour la tester, puis introduisez une poignée partagée pour confirmer qu'il s'agit d'un problème causé par la part.
3 ?? Utilisez curl_error () et curl_errno () pour obtenir des erreurs détaillées doit être vérifiée immédiatement après curl_exec () .
4 ?? Activez les journaux détaillés via Curlopt_verbose :
curl_setopt($ch, CURLOPT_VERBOSE, true);
5 ?? Vérifiez la sécurité des filetages ne partagez pas de poignées dans plusieurs threads, sauf si Libcurl est compilé par fil.