Dans la programmation réseau, en particulier dans les scénarios impliquant de longues connexions, le serveur doit écouter et gérer en permanence plusieurs connexions clients. PHP fournit une fonction de socket riche, socket_accept () est l'une des fonctions importantes utilisées pour recevoir des demandes de connexion client. Cet article introduira en détail comment utiliser socket_accept () pour réaliser une gestion efficace des connexions dans des scénarios de connexion longs.
Une longue connexion signifie qu'après que le client établit une connexion avec le serveur, la connexion reste ouverte et les deux parties peuvent continuer à communiquer jusqu'à ce que la connexion soit explicitement fermée. Par rapport aux connexions courtes, les longues connexions réduisent les frais généraux de connexions fréquemment établies et clôturent et conviennent plus à des scénarios tels que la communication instantanée et la poussée de message.
socket_accept () est utilisé pour accepter une demande de connexion dans la prise d'écoute et renvoyer une nouvelle ressource de socket pour la communication avec le client. L'utilisation typique est la suivante:
$serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($serverSocket, '0.0.0.0', 8080);
socket_listen($serverSocket);
while (true) {
$clientSocket = socket_accept($serverSocket);
if ($clientSocket === false) {
// Gestion des erreurs
continue;
}
// Traiter les demandes des clients
}
Problème de blocage
socket_accept () est un appel de blocage. S'il n'y a pas de demande de connexion, le programme s'arrêtera ici, affectant le traitement simultané de plusieurs clients.
Gestion de la multi-connexion <br> Les connexions longues doivent gérer les opérations de lecture et d'écriture de plusieurs connexions clients en même temps pour éviter le blocage unique.
Occupation des ressources <br> Trop de connexions longues occuperont des ressources système et nécessiteront une libération et une maintenance raisonnables.
Définissez la prise sur le mode non bloquant via socket_set_nonblock () pour éviter le blocage et l'attente des connexions.
socket_set_nonblock($serverSocket);
À l'heure actuelle, socket_accept () ne bloquera pas, et s'il n'y a pas de demande de connexion, FALSE sera retourné.
Socket_Select () permet d'écouter simultanément l'état de lecture et d'écriture de plusieurs sockets, et combiné avec un mode non bloquant, il peut gérer efficacement plusieurs connexions longues.
Exemple de code:
$serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($serverSocket, '0.0.0.0', 8080);
socket_listen($serverSocket);
socket_set_nonblock($serverSocket);
$clients = [];
while (true) {
$readSockets = $clients;
$readSockets[] = $serverSocket;
$write = $except = null;
$numChangedSockets = socket_select($readSockets, $write, $except, 0, 500000);
if ($numChangedSockets === false) {
// Gestion des erreurs
break;
} elseif ($numChangedSockets > 0) {
// Écoutez s'il y a une nouvelle connexion
if (in_array($serverSocket, $readSockets)) {
$newClient = socket_accept($serverSocket);
if ($newClient !== false) {
socket_set_nonblock($newClient);
$clients[] = $newClient;
}
// Supprimer les prises d'écoute transformées
$key = array_search($serverSocket, $readSockets);
unset($readSockets[$key]);
}
// Traiter les données des clients
foreach ($readSockets as $clientSocket) {
$data = @socket_read($clientSocket, 1024, PHP_NORMAL_READ);
if ($data === false || $data === '') {
// Le client ferme la connexion
$key = array_search($clientSocket, $clients);
socket_close($clientSocket);
unset($clients[$key]);
} else {
$data = trim($data);
if ($data) {
// 这里Traiter les données des clients
socket_write($clientSocket, "Le serveur a été reçu: $data\n");
}
}
}
}
// La détection du battement de cœur peut être ajoutée ici、Traitement du délai et autre logique
}
Mécanisme de rythme cardiaque : envoyez régulièrement des paquets de battements cardiaques pour détecter la survie du client et clôturer les connexions invalides dans le temps.
Pool de connexion : limitez le nombre maximum de connexions pour éviter l'épuisement des ressources.
Déconnexion du délai : Fermez les connexions qui n'ont aucune interaction de données pendant longtemps.
En définissant un mode non bloquant et en combinant la technologie de multiplexage socket_select () , PHP peut utiliser efficacement socket_accept () pour gérer les connexions longues, réalisant le traitement simultané d'un grand nombre de connexions client. La conception rationnelle des mécanismes de maintenance de connexion et de gestion des ressources peut garantir un fonctionnement stable du serveur et améliorer les performances dans les scénarios à longue connexion.