Lors de la programmation du socket PHP, le mécanisme de gestion des erreurs est un élément important pour assurer la robustesse du programme. PHP fournit deux fonctions principales: socket_clear_error () et socket_last_error () pour aider les développeurs à obtenir et à gérer les erreurs de socket. Cependant, la sortie de ces deux fonctions elles-mêmes est encore relativement bas, et il y a encore des inconvénients pour les développeurs pour localiser et résoudre rapidement des problèmes. Cet article explorera comment combiner ces deux fonctions avec un mécanisme de mappage de code d'erreur personnalisé pour créer une solution de gestion des erreurs plus efficace et pratique.
Cette fonction renvoie le code d'erreur de l'opération de socket la plus récente. Vous pouvez obtenir le dernier code d'erreur de socket sans transmettre les paramètres, ou vous pouvez transmettre une ressource de socket spécifique pour obtenir les erreurs correspondantes pour la ressource.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, 'm66.net', 80);
$errCode = socket_last_error($socket);
echo "Code d'erreur:$errCode\n";
Obtenez la description du texte du code d'erreur:
echo socket_strerror($errCode);
Cette fonction peut effacer l'état d'erreur actuel ou spécifié pour éviter l'ancien code d'erreur affectant le jugement d'un nouveau cycle d'opérations.
socket_clear_error($socket);
Bien que Socket_Sistror () fournit des informations de description d'erreur, ses informations sont généralement plus générales et principalement en anglais, et n'est souvent pas assez claire pour des scénarios complexes (tels que la sortie multilingue, la classification du niveau d'erreur, le développement et le débogage par rapport aux journaux de production). Par conséquent, l'introduction d'un ensemble de "mécanisme de mappage de code d'erreur personnalisé" est la clé pour améliorer la qualité du traitement des erreurs.
Nous pouvons cartographier les codes d'erreur communs via un tableau associatif. Les exemples sont les suivants:
$socketErrorMap = [
10061 => ['msg' => 'Connexion rejetée,L'hôte cible n'a pas de service d'écoute', 'level' => 'error'],
10060 => ['msg' => 'Délai de connexion,Le serveur ne répond pas', 'level' => 'warning'],
10054 => ['msg' => 'L'hôte distant a forcé une connexion existante pour fermer', 'level' => 'error'],
// Ajouter plus de cartes...
];
function handleSocketError($socket = null, $clear = true) {
$errCode = socket_last_error($socket);
global $socketErrorMap;
$defaultMsg = socket_strerror($errCode);
$mapped = $socketErrorMap[$errCode] ?? ['msg' => $defaultMsg, 'level' => 'notice'];
if ($clear) {
socket_clear_error($socket);
}
// Étendu à l'exploitation forestière、Exception lancée, etc.
echo "[{$mapped['level']}] Code d'erreur: $errCode - {$mapped['msg']}\n";
}
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
@socket_connect($socket, 'm66.net', 12345); // Supposons que ce port n'a pas de moniteur
handleSocketError($socket); // Sortir un message d'erreur plus amical
socket_close($socket);
La sortie peut être:
[error] Code d'erreur: 10061 - Connexion rejetée,L'hôte cible n'a pas de service d'écoute
Séparation de l'environnement de développement et de l'environnement de production : les informations d'erreur détaillées peuvent être sorties pendant la phase de développement, et l'environnement de production peut être unifié dans un format de journal standard.
Utiliser en combinaison avec les systèmes de journalisation : vous pouvez utiliser des bibliothèques de journaux telles que Monolog pour enregistrer les informations d'erreur dans les fichiers, les bases de données ou les systèmes de surveillance.
Support multilingue adaptable : Description d'erreur Les informations peuvent être étendues en formats multilingues, améliorant les capacités d'internationalisation du système.
Via socket_clear_error () et socket_last_error () combinés avec des mécanismes de mappage d'erreur personnalisés, nous pouvons atteindre une reconnaissance et une réponse d'erreur plus raffinées, améliorant considérablement la maintenabilité et la convivialité des applications de socket. Cette approche améliore non seulement la lisibilité de la sémantique d'erreur, mais jette également les bases des extensions ultérieures (telles que la nouvelle tentative automatique, la journalisation affinée, etc.). Il s'agit d'une meilleure pratique à promouvoir pour les développeurs.