socket_last_error () est un outil de débogage très important lors de la programmation des réseaux utilisant PHP. Il peut nous aider à obtenir le code d'erreur qui s'est produit dans la dernière opération de socket, puis à localiser le problème. Cependant, de nombreux développeurs ont rapporté que: socket_last_error () renvoie toujours 0 même si une exception est clairement présente, ce qui rend le débogage extrêmement difficile. Cet article analysera les causes profondes de ce phénomène en profondeur et en points clés que vous pouvez négliger.
La fonction de la fonction socket_last_error () consiste à renvoyer le dernier code d'erreur qui se produit sur la ressource de socket spécifiée. Si la ressource de socket n'est pas transmise, le code d'erreur pour la prise par défaut actuelle est renvoyé. Il convient de noter que la fonction ne renvoie le code d'erreur que dans la dernière opération, et sa valeur sera réinitialisée une fois l'appel réussi ou l'erreur est effacée.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "Échec de la création de socket,Code d'erreur:" . socket_last_error() . "\n";
}
Il y a généralement plusieurs raisons courantes pour socket_last_error () pour toujours retourner 0:
socket_last_error () Si aucune prise n'est spécifiée, elle renverra l'état d'erreur de la prise par défaut. Si vous utilisez plusieurs sockets ou si vous n'êtes pas spécifié explicitement, 0 sera retourné.
// Démonstration d'erreur,Aucune prise spécifiée
$errorCode = socket_last_error(); // Probablement toujours0
// Démonstration correcte
$errorCode = socket_last_error($socket);
Lorsqu'une opération de socket est exécutée avec succès, le code d'erreur sera réinitialisé à 0. En outre, si vous appelez socket_clear_error () , l'état d'erreur précédent sera également effacé.
// Détecter les erreurs avant l'opération
$errorCode = socket_last_error($socket);
// S'il a été appelé avec succès socket_connect ou socket_write,L'erreur peut avoir été effacée
socket_clear_error($socket);
// À ce moment-là socket_last_error() Reviendra 0
Parfois, vous pensez que l'opération est anormale, mais c'est en fait une erreur dans la logique métier ou d'autres endroits, et la prise elle-même ne génère pas d'erreur. Par conséquent, il est normal pour socket_last_error () de retourner 0.
En combinaison avec les précautions ci-dessus, il est recommandé d'utiliser le mode suivant pour déboguer les erreurs:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "Échec de la création de socket,Code d'erreur:" . socket_last_error() . "\n";
exit;
}
$result = socket_connect($socket, "gitbox.net", 80);
if ($result === false) {
$err = socket_last_error($socket);
echo "Échec de la connexion,Code d'erreur:$err - " . socket_strerror($err) . "\n";
} else {
echo "Connexion avec succès!\n";
}
Il est particulièrement important de noter ici que socket_last_error () doit être transmis dans la ressource de socket pour obtenir des informations d'erreur précises.
Nettoyage des messages d'erreur : Si vous appelez socket_clear_error ($ socket) , alors appelez socket_last_error ($ socket) renverra 0.
Opérations asynchrones ou non bloquantes : Dans les opérations de socket asynchrones ou non bloquant, certaines erreurs peuvent ne pas être immédiatement reflétées à socket_last_error () et doivent être vérifiées en combinaison avec d'autres états.
Traduction du code d'erreur : utilisez socket_strorror () pour convertir les codes d'erreur en descriptions d'erreur faciles à comprendre.
La compréhension et l'utilisation correcte de socket_last_error () peuvent considérablement améliorer l'efficacité du débogage du réseau et éviter les erreurs de jugement car le code d'erreur est toujours 0. J'espère que cet article peut vous aider à comprendre pourquoi vous retournez toujours 0 et rendez votre programme réseau plus robuste.