En raison de sa communication en temps réel bidirectionnelle, la technologie WebSocket est largement utilisée dans le chat en ligne, la poussée en temps réel, l'interaction du jeu et d'autres scénarios. Les performances et la stabilité des communications réseau deviennent essentielles lors de la création de services WebSocket à l'aide de PHP. La fonction SOCKET_SET_BLOCK , en tant qu'outil important dans la programmation de socket PHP, peut nous aider à contrôler efficacement l'état de blocage et non bloquant de la prise, optimisant ainsi la vitesse de réponse et l'utilisation des ressources des services WebSocket.
Cet article combinera l'expérience pratique du projet pour expliquer en profondeur comment utiliser efficacement la fonction SOGKET_SET_BLOCK dans le service WebSocket et partager certaines compétences pratiques.
socket_set_block est une fonction fournie par PHP pour définir si le socket est en mode de blocage. En mode blocage, les opérations de socket (telles que la lecture ou l'écriture) attendent que l'opération se termine avant le retour; En mode non bloquant, l'opération reviendra immédiatement et si aucune donnée n'est disponible, une erreur sera renvoyée.
<?php
// installation socket En mode blocage
socket_set_block($socket);
// installation socket En mode non bloquant
socket_set_nonblock($socket);
?>
Dans WebSocket Services, le choix du blocage et du non-bloquant a un impact énorme sur les performances.
Mode de blocage <br> Convient pour des scénarios simples, le flux de code est intuitif, mais il peut provoquer un retard de processus, en particulier lorsque le client répond lentement, le serveur peut être "traîné" par une connexion.
Mode non bloquant <br> Permet au serveur de revenir immédiatement et continue de traiter d'autres tâches, ce qui convient plus à des environnements à haute monnaie et multi-connexion. Cependant, la complexité de programmation augmente, et il est nécessaire de combiner le sondage (tel que Socket_Select ) ou des modèles axés sur l'événement.
Dans les projets réels, mon expérience est d'adopter la stratégie "Switch flexible":
Phase d'établissement de connexion : Définissez la prise sur le blocage pour s'assurer que la poignée de main de connexion est terminée de manière fiable.
Étape de transmission des données : Passez à la non-blocage et combinez Socket_Select pour interroger et écouter plusieurs connexions pour éviter les goulets d'étranglement des performances causés par le blocage.
Exemple d'extrait de code:
<?php
$serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($serverSocket, '0.0.0.0', 9501);
socket_listen($serverSocket);
socket_set_block($serverSocket);
while (true) {
$clientSocket = socket_accept($serverSocket);
if ($clientSocket !== false) {
// Complétez la poignée de main,installation非阻塞模式,Commencer le traitement asynchrone
socket_set_nonblock($clientSocket);
// Volonté $clientSocket Ajouter à la liste des clients,Utiliser par la suite socket_select traiter avec
$clients[] = $clientSocket;
}
// utiliser socket_select Écoutez plusieurs clients,Évitez le blocage
$read = $clients;
$write = null;
$except = null;
if (socket_select($read, $write, $except, 0, 200000) > 0) {
foreach ($read as $readSocket) {
$data = socket_read($readSocket, 2048);
if ($data === false || $data === '') {
// Connexion fermée ou erreur,Nettoyer les ressources
$index = array_search($readSocket, $clients);
unset($clients[$index]);
socket_close($readSocket);
} else {
// traiter avec WebSocket Cadres de données
// ...
}
}
}
}
?>
Évitez le blocage à long terme : appelez socket_read en mode blocage. Si le client ne répond pas, le processus peut être suspendu. Il est recommandé de combiner le contrôle du délai d'expiration ou de changer de blocage le plus tôt possible.
Utilisation raisonnable de socket_select : en combinaison avec le mode non bloquant, le serveur peut gérer un grand nombre de connexions en même temps et améliorer le débit.
La gestion des erreurs doit être détaillée : en mode non bloquant, Socket_read peut renvoyer un code d'erreur tel que Eagain , et il doit être géré raisonnablement après le jugement.
Gestion de la mémoire : fermez la prise déconnectée pour éviter les fuites de mémoire.
Manuel de fonction officielle de socket PHP
<code> https://gitbox.net/manual/en/function.socket-set-lock.php </code>
Standard du protocole WebSocket (RFC 6455)
<code> https://gitbox.net/rfc6455 </code>