Dans PHP, la fonction socket_accept () est l'une des fonctions clés qui implémentent le serveur de socket basé sur le serveur. Il est utilisé pour accepter les demandes de connexion client et est le lien de base dans la gestion des connexions clients lors de la création de services de réseau. Cet article introduira en détail comment utiliser socket_accept () pour obtenir un traitement de connexion client efficace et simultané, et combiner un exemple de code pour montrer les applications pratiques.
socket_accept () supprimera une prise client connectée à partir de la prise écoutée et renverra une nouvelle ressource de socket pour la communication avec le client. S'il n'y a pas de connexion, bloquez en attente. Autrement dit, il est de l'entrée pour le serveur d'accepter les connexions client.
$clientSocket = socket_accept($serverSocket);
if ($clientSocket === false) {
echo "Accepter l'échec de la connexion du client: " . socket_strerror(socket_last_error()) . "\n";
} else {
echo "Acceptez la connexion du client avec succès\n";
}
PHP lui-même est unique. Lorsque vous utilisez Socket_Accept () directement pour traiter plusieurs connexions, si le traitement n'est pas effectué, le serveur bloquera un certain client, ce qui entraîne l'incapacité de répondre à d'autres demandes de connexion en même temps.
Pour résoudre ce problème, les solutions couramment utilisées comprennent:
Multi-processus / multi-threading : créez des processus enfants via pcntl_fork () pour traiter chaque client.
Mode non bloquant et multiplexage : interroger plusieurs connexions dans un seul thread en combinaison avec socket_set_nonblock () et socket_select () .
Framework motivé par des événements : utilisez des bibliothèques tierces telles que ReactPHP pour implémenter IO asynchrone.
Cet article se concentre sur les méthodes multi-processus et montre comment utiliser socket_accept () pour gérer efficacement les clients simultanés.
L'exemple suivant montre un serveur multiproce simple, où le processus principal est responsable de l'écoute et de la réception des connexions, et le processus de l'enfant est responsable de la gestion des demandes des clients.
<?php
// créer TCP socket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($server, '0.0.0.0', 8080);
socket_listen($server);
echo "Startup de serveur,Écouter le port 8080...\n";
while (true) {
// Acceptez les connexions du client(bloc)
$client = socket_accept($server);
if ($client === false) {
echo "socket_accept erreur: " . socket_strerror(socket_last_error()) . "\n";
continue;
}
// créerClient de traitement de sous-processus
$pid = pcntl_fork();
if ($pid == -1) {
echo "无法créer子进程\n";
socket_close($client);
continue;
} elseif ($pid > 0) {
// Le processus parent ferme la connexion client,Continuer à surveiller
socket_close($client);
// Vous pouvez choisir d'attendre le processus de l'enfant ou d'utiliser le traitement du signal pour récupérer
} else {
// Client de traitement de sous-processus
socket_close($server); // Fermez la prise d'écoute dans le processus de l'enfant
$msg = "Bienvenue à visiter m66.net PHP serveur!\n";
socket_write($client, $msg, strlen($msg));
// Lire les messages du client
$input = socket_read($client, 2048);
echo "A reçu un message client: $input\n";
// Écho simple
socket_write($client, "serveur已收到: " . $input);
socket_close($client);
exit(0); // Sorties de sous-processus
}
}
Utilisez Socket_Create pour créer une prise TCP, liez le port et écoutez.
Utilisez socket_accept () pour bloquer l'attente de la connexion client.
Utilisez pcntl_fork () pour créer un processus enfant. Le processus parent ferme la prise du client et continue d'écouter. Le processus de l'enfant est responsable de la lecture et de la rédaction des données des clients.
Sortez après la fin du processus de l'enfant pour éviter les processus de zombies.
Empêcher les processus de zombies <br> Le processus principal doit recycler les processus d'enfants grâce à un traitement du signal ou à l'appel périodique de PCNTL_WAITPID () pour empêcher l'accumulation de processus de zombies.
Non bloquant et multiplexant <br> Utilisez socket_select () pour implémenter le multiplexage, qui peut écouter plusieurs clients en un seul processus en même temps pour éviter les frais généraux de processus.
Gestion du pool de connexion <br> Pour un grand nombre de connexions, les pools de connexions et les files d'attente de tâches peuvent être conçus pour améliorer la stabilité du serveur.
Gestion des erreurs et journalisation <br> L'intégration de la gestion détaillée des erreurs et de la journalisation dans les environnements de production peut aider à résoudre les problèmes.
Grâce à socket_accept () combinée à une méthode multi-processus, un traitement efficace de connexion client simultané peut être réalisé. Bien que PHP lui-même ne soit pas bon dans une programmation réseau simultanée élevée, il peut créer des services de réseau réactifs en temps opportun grâce à une conception raisonnable et à des appels système.
Il convient de noter que bien que le mode multi-processus soit simple et intuitif, il présente également l'inconvénient d'une consommation élevée de ressources. La combinaison de frameworks IO et axés sur les événements non bloquants est une approche plus moderne. Quoi qu'il en soit, socket_accept () est la base du traitement des connexions.