Position actuelle: Accueil> Derniers articles> Utilisez socket_set_block pour contrôler le flux d'état pendant la phase d'initialisation de connexion

Utilisez socket_set_block pour contrôler le flux d'état pendant la phase d'initialisation de connexion

gitbox 2025-05-29

socket_set_block () est une fonction importante mais souvent négligée lors de la programmation de réseaux de bas niveau en utilisant PHP. Il contrôle si la prise est en mode de blocage, affectant ainsi le comportement de la prise pendant la phase d'initialisation de connexion. Cet article utilisera des exemples et des principes pour illustrer comment utiliser socket_set_block () pour contrôler le flux d'état des connexions et analyser sa fonction.

Aperçu des modes de blocage et de non-blocage

Dans la communication réseau, le «blocage» signifie que lorsqu'une opération de socket (comme la connexion ou la lecture ) ne peut pas être terminée immédiatement, le programme interrompra l'exécution et attendra que l'opération se termine. "Non bloquant" signifie que ces opérations reviendront immédiatement et que le programme peut continuer à exécuter une autre logique.

Dans PHP, Socket est en mode de blocage par défaut. Cela signifie que si vous appelez socket_connect () et que le serveur distant ne répond pas, le script attendra que la connexion soit réussie ou chronométrée.

Utilisation de socket_set_block ()

socket_set_block () est une fonction fournie par PHP pour définir le socket sur le mode de blocage. La fonction non bloquante correspondante est socket_set_nonblock () . Lors du contrôle du processus d'initialisation de connexion, la combinaison de ces deux fonctions peut obtenir une logique de gestion de connexion plus flexible.

 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("Impossible de créersocket: " . socket_strerror(socket_last_error()));
}

// Réglé sur le mode non bloquant pour contrôler le processus de connexion
socket_set_nonblock($socket);

$host = 'gitbox.net';
$port = 80;
$time_start = time();
$timeout = 5;

// Essayez de se connecter
@socket_connect($socket, $host, $port);

// Passer en mode de blocage,Coopérer select Attendez que la connexion se termine
socket_set_block($socket);

// utiliser select Attendez le résultat de la connexion
$write = [$socket];
$except = [$socket];
$read = null;
$tv_sec = $timeout;
$tv_usec = 0;

$select_result = socket_select($read, $write, $except, $tv_sec, $tv_usec);
if ($select_result > 0 && in_array($socket, $write)) {
    echo "Connexion avec succès\n";
} else {
    echo "La connexion a échoué ou chronométré\n";
}

socket_close($socket);

La signification du contrôle du flux d'état de connexion

  1. Évitez de bloquer le thread principal : dans certains scénarios d'application (tels que les serveurs asynchrones ou les clients axés sur des événements qui nécessitent plusieurs connexions pour être tenté en même temps), nous ne pouvons pas laisser une seule prise bloquer l'ensemble du processus. En définissant le non-bloquant avant la connexion et en passant manuellement en mode de blocage, vous pouvez obtenir la combinaison de "Connexion asynchrone + fonctionnement synchrone".

  2. Mécanisme de délai de temps personnalisé : le temps de blocage de socket_connect () est contrôlé par le délai d'expiration par défaut du système d'exploitation, mais via non blocking et socket_select () , le temps d'attente de connexion peut être contrôlé avec précision pour éviter la dégradation de l'expérience utilisateur en raison de la réponse lente du serveur.

  3. Gestion de flux d'état plus complexe : le contrôle manuel de l'état de socket est la capacité de base lors de la mise en œuvre de modèles de réseau avancés tels que les machines d'État et les planificateurs de tâches. L'utilisation de socket_set_block () peut clairement distinguer les opérations «confirmer la réponse» plutôt que de «comportement d'essai».

Comparaison avec Stream_Socket_Client

Bien que PHP fournit un stream de niveau supérieur_socket_client () qui prend également en charge le blocage du blocage ou le non-blocage, l'opération de socket sous-jacente est plus adaptée aux scénarios où le contrôle granulaire de l'état de connexion est requis. Par exemple, des outils de test de connexion à forte concurrence, des clients HTTP personnalisés et même des émulateurs de protocole basés sur des douilles.

Conclusion

Bien que socket_set_block () semble être juste une fonction de commutation d'état simple, il apporte un degré élevé de contrôlabilité et d'évolutivité à la communication du socket PHP pendant l'étape d'initialisation de connexion. La maîtrise de son utilisation aidera à développer des programmes de communication de réseau plus robustes et plus flexibles, en particulier dans les scénarios avec des protocoles élevés de concurrence, asynchrones ou personnalisés, qui sont indispensables.