Lors de la programmation dans Socket de PHP, socket_read () est une fonction commune qui lit les données des sockets. Cependant, dans les applications réelles, socket_read () peut échouer en raison de conditions de réseau ou de problèmes de connexion, entraînant des codes d'erreur résiduels. Afin d'assurer la stabilité et la robustesse du programme, nous devons effacer les erreurs dans le temps et réessayer après l'échec de la lecture. À l'heure actuelle, la fonction socket_clear_error () est utile.
Cet article introduira en détail comment combiner socket_read () et socket_clear_error () pour la gestion des erreurs et la réessayer.
socket_read () est utilisé pour lire les données à partir d'une prise connectée, avec la syntaxe comme suit:
socket_read(resource $socket, int $length, int $type = PHP_BINARY_READ): string|false
$ socket : ressource de socket.
$ Longueur : le nombre maximum d'octets à lire.
$ Type : Type de lecture, par défaut en lecture binaire.
Si la lecture est réussie, la chaîne de lecture sera retournée; S'il échoue, FALSE sera retourné.
Lorsque socket_read () échoue, un état d'erreur sera laissé à l'intérieur de la prise, ce qui peut affecter les opérations ultérieures. Par exemple, socket_last_error () renverra le dernier code d'erreur. Si l'état d'erreur n'est pas effacé, le programme peut être dans l'état d'erreur tout le temps, ce qui entraîne des échecs répétés.
socket_clear_error () est utilisé pour effacer l'état d'erreur de socket et s'assurer que les opérations suivantes peuvent être exécutées normalement.
Ce qui suit est un exemple de code montrant comment effacer l'erreur et essayer de réessayer la lecture après socket_read () échoue.
<?php
// créer socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("créer socket échouer: " . socket_strerror(socket_last_error()) . "\n");
}
// Connectez-vous au serveur(Assumer l'adresse et le port du serveur)
$server = "m66.net";
$port = 12345;
if (!socket_connect($socket, $server, $port)) {
die("Connectez-vous au serveuréchouer: " . socket_strerror(socket_last_error($socket)) . "\n");
}
$maxRetries = 3; // Nombre maximum de réessayer
$retryCount = 0;
$readLength = 1024;
while ($retryCount < $maxRetries) {
$data = socket_read($socket, $readLength);
if ($data === false) {
// 读取échouer,Obtenez le code d'erreur
$errorCode = socket_last_error($socket);
$errorMsg = socket_strerror($errorCode);
echo "socket_read échouer,Code d'erreur:$errorCode,message d'erreur:$errorMsg\n";
// Effacer l'erreur
socket_clear_error($socket);
echo "Dégagé socket erreur,Prêt à réessayer...\n";
$retryCount++;
// Facultatif:Réessayer après avoir dormi pendant un moment,Évitez les demandes fréquentes
sleep(1);
continue;
}
// Lire avec succès,Données de sortie et sauter de la boucle
echo "Lire les données:" . $data . "\n";
break;
}
if ($retryCount === $maxRetries) {
echo "Le nombre de réessayer a atteint le maximum,读取échouer。\n";
}
// fermeture socket
socket_close($socket);
?>
Créer et connecter à Socket : Ici, nous nous connectons à un port de m66.net .
Loop Tentatives de lire les données : au maximum, 3 lectures sont tentées, et en cas d'échec, le traitement d'erreur est effectué.
Manipulation des échecs :
Obtenez le code d'erreur via socket_last_error () .
Utilisez socket_strorror () pour obtenir la description de l'erreur.
Appelez socket_clear_error () pour effacer l'état d'erreur.
Attendez une seconde avant de continuer à réessayer.
Si la lecture a réussi, les données seront imprimées et la boucle sera sortie .
Fermez la connexion et relâchez la ressource .
Lorsque vous rencontrez une défaillance lorsque vous lisez des données à l'aide de socket_read () , n'oubliez pas d'appeler socket_clear_error () pour effacer l'erreur. Cela peut éviter l'accumulation d'erreur et assurer l'exécution correcte de l'opération suivante. Dans le même temps, combiné avec le mécanisme de réessayer, la stabilité de la communication du réseau peut être améliorée.