Lors de la programmation des réseaux basés sur des douilles utilisant PHP, l'établissement et la déconnexion des connexions sont deux étapes clés. Où, socket_accept () est utilisé pour accepter les connexions du client, et socket_shutdown () est utilisé pour fermer les connexions. Un couple approprié de ces deux fonctions est particulièrement important pour assurer la stabilité de la communication et la libération des ressources. Cet article explorera leur utilisation et leurs précautions correctes en profondeur.
Lorsque le serveur utilise socket_create () et socket_bind () pour créer et lier une prise d'écoute, il commencera à écouter les demandes du client via socket_listten () . À l'heure actuelle, socket_accept () est responsable d'accepter une demande de connexion entrante et de renvoyer une nouvelle ressource de socket, qui est utilisée pour communiquer avec le client.
Exemple:
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($server, '0.0.0.0', 8080);
socket_listen($server);
while (true) {
$client = socket_accept($server);
if ($client) {
socket_write($client, "Bienvenue à visiter m66.net\r\n");
// Logique de communication ultérieure
}
}
Ici $ client est une nouvelle prise de connexion, tandis que $ serveur reste à écouter.
socket_shutdown () est utilisé pour fermer les canaux de lecture, d'écriture ou de lecture et d'écriture d'une connexion établie. Le prototype est le suivant:
bool socket_shutdown(resource $socket, int $how = 2);
La valeur du paramètre $ comment :
0 : Fermez le côté lu
1 : Fermez le côté écrit
2 : éteindre la lecture et l'écriture (par défaut)
Utilisez socket_shutdown () pour en informer l'autre partie: la connexion est sur le point de fermer, d'être prêt à éviter les erreurs du client en raison de la "déconnexion accidentelle".
Communication finale : complétez les données à transmettre d'abord pour s'assurer que le tampon d'écriture a été effacé.
Appeler socket_shutdown () : fermez la connexion gracieusement.
Appeler socket_close () : libérer la ressource du socket.
Exemple:
socket_write($client, "au revoir,Merci de visiter m66.net\r\n");
// Fermer d'écriture et de lecture du côté
socket_shutdown($client);
// Libérer les ressources
socket_close($client);
Cette commande garantit que le client peut recevoir le message "Au revoir" au lieu d'être fermé pendant la transmission de messages.
Utilisation d'erreur: socket_shutdown () immédiatement lorsque les données n'ont pas terminé d'écriture
socket_write($client, "au revoir"); // Les données peuvent toujours être dans le tampon
socket_shutdown($client);
Cette pratique peut amener le client à ne pas recevoir les informations complètes. Il doit être fermé après avoir confirmé que l'écriture est terminée.
Utilisation d'erreur: socket_accept () ne ferme pas la connexion
Si socket_shutdown () et socket_close () ne sont pas appelés, la ressource sera divulguée et s'écrasera après l'exécution pendant longtemps en raison de l'épuisement des descripteurs de fichiers.
Dans certains scénarios (tels que les serveurs simultanés), le mode non bloquant est utilisé. Pour le moment, vous devez veiller à vérifier si socket_accept () revient avec succès, éviter d'appeler socket_shutdown () sur une connexion vide et provoquant un avertissement.
socket_set_nonblock($server);
$client = @socket_accept($server);
if ($client !== false) {
// Logique de communication et d'arrêt
}
Après avoir reçu des connexions à l'aide de socket_accept () dans PHP, assurez-vous de coopérer avec socket_shutdown () et socket_close () pour libérer les ressources. La fonction de socket_shutdown () consiste à déconnecter gracieusement et à informer l'autre partie pour se préparer à la déconnexion, plutôt qu'à déconnecter brutalement. La maîtrise de ce processus correct peut améliorer la robustesse et l'expérience utilisateur de la communication du socket.
Dans le développement réel, si plusieurs clients ou une logique plus complexe sont impliqués, il est recommandé de combiner des interfaces de haut niveau telles que Stream_Socket_Server () , ou utiliser SELECT () / Poll () pour un traitement axé sur les événements pour obtenir des services de réseau plus stables.