La mise en œuvre d'un serveur de blocage basé sur des douilles dans PHP peut nous aider à comprendre le principe de communication du réseau sous-jacent. Le mode de blocage signifie que le serveur attendra que les données soient lues ou écrites jusqu'à ce que les données puissent être traitées ou que la connexion soit prête. Cet article analysera pas par étape comment utiliser l'extension de socket de PHP, de la création de sockets au réglage en mode blocage et de créer un serveur de blocage simple.
Tout d'abord, assurez-vous que l'extension de socket est activée dans l'environnement PHP. Trouvez et décommentez la ligne suivante dans php.ini (le cas échéant):
extension=sockets
Utilisez la commande php -m pour vérifier si l'extension est activée:
php -m | grep sockets
Si vous pouvez voir des sockets , l'extension est activée.
Voici les étapes de base pour créer une prise et étape par étape introduire le rôle de chaque fonction.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create() failed: " . socket_strerror(socket_last_error()) . "\n");
}
Ici, nous créons un socket TCP ( sock_stream ) basé sur IPv4 ( af_inet ).
Certaines options de socket peuvent être définies, telles que la réutilisation du port:
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
$host = '0.0.0.0';
$port = 9000;
if (!socket_bind($socket, $host, $port)) {
die("socket_bind() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}
if (!socket_listen($socket, 5)) {
die("socket_listen() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}
5 Indique le nombre maximum de demandes de connexion en attente.
Utilisez socket_set_block pour définir le socket sur le mode de blocage.
if (!socket_set_block($socket)) {
die("socket_set_block() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}
Une fois défini sur le mode de blocage, socket_accept ultérieur, socket_read et autres fonctions bloqueront jusqu'à la fin de l'opération.
echo "Le serveur est démarré,Écouter le port $port...\n";
while (true) {
$clientSocket = socket_accept($socket);
if ($clientSocket === false) {
echo "socket_accept() failed: " . socket_strerror(socket_last_error($socket)) . "\n";
continue;
}
$input = socket_read($clientSocket, 1024);
if ($input === false) {
echo "socket_read() failed: " . socket_strerror(socket_last_error($clientSocket)) . "\n";
} else {
$input = trim($input);
echo "A reçu un message: $input\n";
$response = "Tu l'as envoyé:$input\n";
socket_write($clientSocket, $response, strlen($response));
}
socket_close($clientSocket);
}
N'oubliez pas de fermer la prise principale lorsque vous devez quitter:
socket_close($socket);
Vous pouvez utiliser un client de ligne de commande tel que Telnet Connection Test:
telnet gitbox.net 9000
Ou écrivez un client PHP simple pour les tests de connexion.
Par socket_create à socket_set_block , nous construisons un serveur de blocage complet. Ce mode convient aux applications de communication réseau simples, telles que l'enseignement, le débogage ou les scénarios à faible monnaie. Pour les scénarios de concurrence élevés, il est recommandé d'utiliser le mode non bloquant ou d'utiliser SELECT / POLL pour obtenir des boucles d'événements plus efficaces.
Grâce aux étapes pratiques de cet article, vous pouvez maîtriser l'ensemble du processus de construction de serveurs de blocage dans PHP et présenter une base solide pour une programmation réseau approfondie.