Dans PHP, Socket est un mécanisme de communication du réseau, à travers lequel les connexions sont établies entre les clients et les serveurs. Lorsque nous utilisons des sockets pour gérer les connexions TCP / IP, nous devons souvent contrôler l'arrêt de la connexion. Socket_shutdown () est une fonction fournie dans PHP pour fermer élégamment une connexion de socket établie, assurer une transmission complète des données et éviter les déchets de ressources causés par une fermeture de connexion anormale.
Cet article explorera correctement comment utiliser Socket_Shutdown () pour fermer élégamment une connexion à douille pour éviter les problèmes potentiels causés par des méthodes de fermeture incorrectes.
Lorsque vous utilisez des sockets pour communiquer en PHP, vous passez généralement par les étapes suivantes:
Créer un socket : créer une ressource de socket via socket_create () .
Socket lié : liez une adresse IP et un numéro de port à la prise via socket_bind () .
Écoutez la connexion : utilisez socket_listten () pour démarrer l'écoute et attendre que le client lance la connexion.
Acceptez la connexion : acceptez la demande de connexion du client via socket_accept () .
Données de lecture / écriture : utilisez socket_read () et socket_write () pour transmettre des données.
Socket de fermeture : Une fois la communication terminée, appelez socket_close () pour fermer la connexion de la prise.
Dans ce processus, lorsqu'il est nécessaire de fermer la connexion gracieusement, nous pouvons utiliser socket_shutdown () pour nous assurer que la fermeture de la connexion n'affecte pas les données transmises.
socket_shutdown () est utilisé pour éteindre la fonction de lecture et d'écriture d'une prise, et est généralement utilisé avec socket_close () . Sa syntaxe est la suivante:
bool socket_shutdown ( resource $socket [, int $how = 2 ] )
$ socket : indique la ressource de socket à fermer.
$ comment : spécifie la méthode à fermer, la valeur par défaut est 2. Valeurs souhaitables:
0 : Éteignez la fonction d'écriture de Socket.
1 : Éteignez la fonction de lecture de la prise.
2 : Éteignez la fonction de lecture et d'écriture de Socket (par défaut).
Le simple fait d'appeler socket_close () pour fermer directement la connexion peut entraîner le transfert des données. socket_shutdown () assure:
La connexion n'est démarrée qu'après que le client ou le serveur a écrit les données.
Fournit un contrôle d'arrêt plus raffiné, qui peut désactiver les opérations de lecture et d'écriture séparément.
Informer l'autre fin à l'avance que la connexion est sur le point de se terminer afin que l'autre partie ait le temps de faire le travail de nettoyage approprié.
Voici un exemple de base de la façon de fermer gracieusement une connexion de socket.
<?php
// Créer un TCP/IP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "Socket La création a échoué:".socket_strerror(socket_last_error());
exit;
}
// Se lier au IP et ports
$bind = socket_bind($socket, '127.0.0.1', 8080);
if ($bind === false) {
echo "La reliure a échoué:".socket_strerror(socket_last_error());
exit;
}
// Commencez à écouter les connexions du client
$listen = socket_listen($socket);
if ($listen === false) {
echo "L'écoute a échoué:".socket_strerror(socket_last_error());
exit;
}
echo "En attente de connexion...\n";
// Accepter la connexion
$client_socket = socket_accept($socket);
if ($client_socket === false) {
echo "Accepter la connexion失败:".socket_strerror(socket_last_error());
exit;
}
// Lire les messages du client
$input = socket_read($client_socket, 1024);
echo "A reçu un message:$input\n";
// Envoyer une réponse au client
socket_write($client_socket, "Données reçues。\n");
// utiliser socket_shutdown Pour fermer la connexion gracieusement
socket_shutdown($client_socket, 2); // Éteignez les opérations de lecture et d'écriture
socket_close($client_socket); // Fermez complètement la connexion
// Fermez enfin le serveur socket
socket_shutdown($socket, 2);
socket_close($socket);
echo "La connexion a été élégamment fermée。\n";
?>
Le client se déconnecte activement : si le client souhaite se déconnecter après avoir envoyé des données sans affecter la transmission de données sur le serveur, vous pouvez appeler socket_shutdown () pour informer le serveur pour cesser de recevoir des données.
Fermez la connexion côté serveur : une fois que le serveur a traité la demande du client, il peut d'abord fermer la rédaction de données, puis fermer l'opération de lecture. Le serveur doit s'assurer que le client reçoit toutes les données avant de fermer la connexion.
Problème de séquence : Lors de la fermeture d'une prise, socket_shutdown () doit être effectué en premier, puis socket_close () doit être appelé, sinon la dernière transmission de données peut être perdue.
Gestion des erreurs : Lorsque vous utilisez socket_shutdown () , vous devez prêter attention à la vérification de la valeur de retour de chaque étape de l'opération afin de faire face aux erreurs possibles en temps opportun.
Environnement multithread / multi-connexion : Dans un environnement de réseau très concurrent, l'attention doit être accordée à la gestion du cycle de vie de chaque connexion afin d'éviter les exceptions de fuite des ressources ou de connexion en raison de la mauvaise méthode d'arrêt.
Socket_shutdown () est une fonction très utile qui aide les développeurs à fermer gracieusement une connexion à socket, garantissant que les données ne sont pas perdues pendant le processus d'arrêt et n'affectent pas d'autres connexions. L'utilisation correcte de socket_shutdown () peut améliorer la stabilité et l'efficacité de la communication du réseau et est l'une des compétences de base que chaque développeur PHP a besoin pour maîtriser.