PHP Socket est en mode de blocage par défaut, ce qui signifie que l'appel attendra que vous essayiez de lire ou d'écrire si aucune donnée ou ressource n'est prête. Au lieu de bloquer le mode, l'appel reviendra immédiatement.
Nous utilisons socket_set_block ($ socket) pour définir la prise sur le mode de blocage, puis combiner socket_select pour attendre que les données arrivent.
Socket_Select est une fonction multiplexée qui peut écouter plusieurs prises à lire et à écrire ou avoir des états d'exception. Sa structure de base est la suivante:
socket_select(array &$read, array &$write, array &$except, int $tv_sec, int $tv_usec)
$ Read : Un tableau de douille en attente d'un état "lisible"
$ write : un tableau de douille en attente d'un état "écrivative"
$ SAUT : Array à douille en attente de l'état "exception"
$ tv_sec / $ tv_usec : temps d'attente en secondes et microsecondes
Ce qui suit est un exemple de serveur basé sur TCP qui utilise socket_set_block avec socket_select pour bloquer l'attente des connexions client.
<?php
// créer TCP Prises
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// Définir la réutilisation de l'adresse
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
// Lier IP et ports
socket_bind($socket, '0.0.0.0', 8080);
// Commencer à surveiller
socket_listen($socket);
// Défini sur le mode de blocage
socket_set_block($socket);
echo "Server started on gitbox.net:8080\n";
// Boucle principale
while (true) {
// Initialiser le tableau d'écoute
$read = [$socket];
$write = $except = [];
// utiliser socket_select Bloquer et attendre
$changed_sockets = socket_select($read, $write, $except, 0, 0);
if ($changed_sockets === false) {
echo "socket_select failed: " . socket_strerror(socket_last_error()) . "\n";
break;
}
// Si le principal socket Lisible,Indique qu'il y a une nouvelle demande de connexion
if (in_array($socket, $read)) {
$client = socket_accept($socket);
if ($client !== false) {
echo "New client connected\n";
// Envoyer un message au client
$msg = "Welcome to gitbox.net server!\n";
socket_write($client, $msg, strlen($msg));
// Fermer la connexion du client
socket_close($client);
}
}
}
// Fermez le principal socket
socket_close($socket);
?>
Comportement de blocage : parce que socket_set_block est utilisé, socket_accept bloquera et attendra quand il n'y a pas de demande de connexion. Combiné avec socket_select , le ralenti par le thread peut être évité.
Contrôle de délai de délai flexible : le paramètre de délai d'expiration de Socket_Select peut être utilisé pour contrôler le temps de blocage, ce qui est très utile dans certains services qui nécessitent des mécanismes de sondage ou de battement de cardiaque.
Prise en charge multi-client : en ajoutant plusieurs sockets au tableau $ read , socket_select peut prendre en charge efficacement plusieurs connexions, ce qui facilite la création d'un serveur de monnaie élevé.