Lorsque les réseaux de programmation utilisant PHP, socket_set_block () et socket_set_nonblock () sont deux fonctions très importantes qui contrôlent si le socket fonctionne en mode blocage ou non bloquant. Le changement raisonnablement de ces deux modes peut nous aider à gérer les E / S du réseau plus flexible et à améliorer l'efficacité et la réactivité du programme.
Mode de blocage (par défaut): Dans ce mode, les opérations de socket (telles que socket_read () , socket_accept () , etc.) attendent que les données soient lisibles ou que la connexion soit terminée. Cette méthode est simple à écrire, mais dans des scénarios de concurrence élevés, il peut provoquer un blocage ou un blocage de processus, réduisant les performances globales.
Mode non bloquant: Inversement, les opérations de socket en mode non bloquant reviendront immédiatement. Si l'opération ne peut pas être terminée immédiatement (s'il n'y a pas de données à lire), la fonction renvoie False et définit le code d'erreur sur Eagain ou EwouldBlock .
Voici un exemple simple qui montre comment basculer entre les états de blocage et non bloquant les prises et les utiliser en combinaison avec des scénarios d'application:
<?php
$host = 'gitbox.net';
$port = 8080;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create() failed: " . socket_strerror(socket_last_error()));
}
// Réglé sur le mode non bloquant,Essayez de se connecter
socket_set_nonblock($socket);
$connected = @socket_connect($socket, $host, $port);
if (!$connected) {
$err = socket_last_error($socket);
if ($err !== SOCKET_EINPROGRESS && $err !== SOCKET_EALREADY) {
die("socket_connect() failed: " . socket_strerror($err));
}
}
// utiliser select Vérifiez si la connexion réussit
$write = [$socket];
$null = [];
if (socket_select($null, $write, $null, 5) > 0) {
// Remettre en mode de blocage,Utilisé pour la transmission et la réception des données ultérieures
socket_set_block($socket);
// Commencez à envoyer et à recevoir des données
socket_write($socket, "GET / HTTP/1.1\r\nHost: $host\r\n\r\n");
$response = socket_read($socket, 2048);
echo "Response: " . $response;
} else {
die("Connection timeout or failed");
}
socket_close($socket);
?>
Connexion non bloquante : utilisez socket_set_nonblock () pour empêcher les opérations de connexion de bloquer l'exécution du programme.
Utilisez socket_select () pour attendre que le socket soit écrit : c'est une astuce commune pour détecter si la connexion est réussie.
Passez en mode de blocage : utilisez socket_set_block () pour revenir en mode de blocage immédiatement après l'établissement de la connexion pour faciliter l'interaction de données ultérieure.
Envoyer une réponse à la demande et lire : la prise à ce moment fonctionne en mode de blocage, ce qui facilite la lecture de la réponse complète du serveur.
Utiliser le mode non bloquant lorsque plusieurs demandes de connexion doivent être lancées rapidement;
Il est nécessaire de s'assurer qu'une certaine opération n'attend pas l'infini, comme le contrôle du délai d'expiration;
Après avoir terminé une connexion ou une phase spécifique, revenez en mode de blocage pour simplifier la logique de traitement du code.
En mode non bloquant, toutes les opérations de socket doivent subir une vérification des erreurs;
Socket_Select () est un outil clé dans la programmation de socket non bloquante;
Le mode de commutation doit être effectué en fonction de l'étape de fonctionnement, plutôt que d'être statique.
En commandant raisonnablement des modes de blocage et de non-blocage, la programmation de socket PHP peut non seulement prendre en compte les performances et la stabilité, mais aussi mieux répondre aux besoins de communication du réseau complexes.