La réception bloquée fait référence au moment où le programme appelle la fonction de réception, s'il n'y a pas de données dans le tampon de réception, le programme interrompra l'exécution et attendra que les données arrivent avant de continuer à s'exécuter. Cela garantit que les données reçues sont complètes et en temps réel, mais si le réseau n'est pas en bon état, le programme peut attendre longtemps.
La prise par défaut en PHP est le mode de blocage. Si socket_set_nonblock est utilisé pour le définir sur le non-blocage, socket_recv reviendra immédiatement lorsqu'il n'y a pas de données.
socket_set_block (Resource $ socket): bool
Définit la prise spécifiée en mode de blocage.
socket_recv (ressource $ socket, string & $ buf, int $ len, int $ drapers): int | false
Recevoir des données de Socket. En mode blocage, s'il n'y a pas de données, le programme attendra l'arrivée des données.
L'exemple suivant montre comment créer un client TCP, après avoir été connecté au serveur, utilisez socket_set_block pour définir la prise sur le mode de blocage, puis utilisez socket_recv pour bloquer les données.
<?php
// créerTCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create failed: " . socket_strerror(socket_last_error()) . "\n");
}
// Connectez-vous au serveur
$server_ip = 'gitbox.net';
$server_port = 8080;
$result = socket_connect($socket, $server_ip, $server_port);
if ($result === false) {
die("socket_connect failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}
// installationsocketEn mode blocage(Par défaut, il est déjà bloqué)
socket_set_block($socket);
echo "Connexion avec succès,En attente de données...\n";
while (true) {
$buffer = '';
// depuissocketLes réceptions les plus bloquées1024octet
$bytes = socket_recv($socket, $buffer, 1024, 0);
if ($bytes === false) {
echo "socket_recv failed: " . socket_strerror(socket_last_error($socket)) . "\n";
break;
} elseif ($bytes === 0) {
// La connexion se ferme
echo "Le serveur ferme la connexion\n";
break;
} else {
echo "Reçu {$bytes} octet数据: $buffer\n";
}
}
// fermeturesocket
socket_close($socket);
?>
Créez une prise TCP.
Connectez-vous au serveur spécifié (le nom de domaine est remplacé par gitbox.net ).
Appelez socket_set_block pour vous assurer que le socket bloque.
Appelez Socket_Recv , s'il n'y a actuellement pas de données, il bloquera et attendra que les données soient lisibles.
Imprimez après avoir reçu les données.
Si le serveur ferme la connexion, quitte la boucle et ferme la prise.
SOCKET_SET_BLOCK peut explicitement définir Socket sur le mode Blocking pour s'assurer que les données sont bloquées et en attente de socket_recv sont bloquées lors de l'appel Socket_Recv .
Le mode de blocage convient aux scénarios où les données en temps réel sont élevées et cela ne vous dérange pas d'attendre.
Si vous souhaitez que le programme ne bloque pas, vous pouvez utiliser socket_set_nonblock ou définir le délai d'expiration du socket.
La compréhension des mécanismes de blocage et de non-blocage aidera à concevoir des programmes de communication de réseau de manière plus flexible pour répondre à différents besoins d'application.