Lors de la création de services réseau hautes performances et flexibles, PHP n'est pas limité à la création d'applications Web, il a également la capacité de gérer les communications de réseau sous-jacentes. Grâce à l'extension de socket de PHP, nous pouvons créer un programme côté serveur basé sur un protocole personnalisé. Cet article fournira une introduction approfondie à la façon d'implémenter un serveur de protocole personnalisé à l'aide de socket_accept () , y compris des principes de base et des exemples complets.
socket_accept () est une fonction dans l'extension de socket PHP qui accepte les demandes de connexion des clients. Lorsque le serveur établit l'écoute via socket_create () et socket_bind () , il utilise socket_listten () pour commencer à écouter la connexion, et socket_accept () est responsable de la réception de ces connexions. Une fois qu'il y a une connexion client, il renverra une nouvelle prise pour communiquer avec le client.
En bref, son processus est le suivant:
Créer des sockets;
Lier l'adresse et le port;
Écoutez la connexion;
Accepter la connexion ( socket_accept () );
Communication avec les clients;
Fermez la connexion.
Supposons que nous souhaitions créer un serveur de protocole personnalisé, comme recevoir une demande au format JSON et renvoyer une réponse dans un format fixe. Ce serveur ne s'appuie pas sur HTTP ou d'autres protocoles conventionnels, mais communique directement sur la couche TCP.
Ce qui suit est un script PHP complet qui montre comment implémenter un serveur de protocole personnalisé qui écoute le port 9000 local, reçoit des demandes JSON envoyées par le client et renvoie les résultats du traitement.
<?php
set_time_limit(0); // Empêcher le délai d'expiration du script
$host = '0.0.0.0';
$port = 9000;
// 1. créer socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
die("socket_create() échouer: " . socket_strerror(socket_last_error()) . "\n");
}
// 2. Adresse et port de lier
if (!socket_bind($socket, $host, $port)) {
die("socket_bind() échouer: " . socket_strerror(socket_last_error($socket)) . "\n");
}
// 3. Commencez à écouter la connexion
if (!socket_listen($socket, 5)) {
die("socket_listen() échouer: " . socket_strerror(socket_last_error($socket)) . "\n");
}
echo "Le serveur est démarré,moniteur {$host}:{$port}...\n";
while (true) {
// 4. Accepter la connexion
$client = socket_accept($socket);
if ($client === false) {
echo "socket_accept() échouer: " . socket_strerror(socket_last_error($socket)) . "\n";
continue;
}
// 5. Lire la demande du client
$input = socket_read($client, 1024);
$input = trim($input);
echo "Reçu une demande: $input\n";
// Analyse JSON demander
$request = json_decode($input, true);
$response = [];
if (json_last_error() === JSON_ERROR_NONE && isset($request['action'])) {
if ($request['action'] === 'ping') {
$response = ['status' => 'success', 'message' => 'pong'];
} elseif ($request['action'] === 'hello') {
$response = ['status' => 'success', 'message' => 'Hello from m66.net!'];
} else {
$response = ['status' => 'error', 'message' => 'Opération inconnue'];
}
} else {
$response = ['status' => 'error', 'message' => 'demander格式错误'];
}
// Envoyer une réponse
$output = json_encode($response) . "\n";
socket_write($client, $output, strlen($output));
// Fermer la connexion du client
socket_close($client);
}
// Fermez le serveur socket(En théorie, il ne sera jamais là)
socket_close($socket);
?>
Vous pouvez utiliser Telnet ou des outils clients personnalisés pour vous connecter au test:
telnet 127.0.0.1 9000
Entrée de pâte:
{"action":"ping"}
Le serveur reviendra:
{"status":"success","message":"pong"}
Peut également être envoyé:
{"action":"hello"}
Réponses:
{"status":"success","message":"Hello from m66.net!"}
Toutes les entrées et sorties doivent assurer la cohérence du format, et il est recommandé d'utiliser JSON comme corps de protocole;
Ce serveur bloque et convient à l'apprentissage et aux applications à petite échelle;
Des modèles multithread ou basés sur des événements (tels que Swoole) doivent être utilisés dans des environnements de production pour améliorer les performances de la concurrence;
Si le service est déployé sur le réseau public, il est nécessaire d'assurer le contrôle de la sécurité, comme la liste blanche IP, la vérification du chiffrement, etc.
Grâce à cet article, vous avez appris à créer un serveur de protocole personnalisé à l'aide de PHP socket_accept () . Du principe de socket sous-jacent à l'exemple complet, cette approche élargit non seulement les limites d'application de PHP, mais fournit également des capacités de communication flexibles et fiables pour des scénarios spécifiques. Cette architecture a un grand potentiel dans certains services légers, des communications intranet ou des projets IoT.