Dans PHP, lors de la communication du réseau, nous devons souvent établir une connexion entre le client et le serveur via le protocole TCP. Pour contrôler le comportement de la connexion, nous pouvons utiliser différentes options de socket pour obtenir la communication réseau non bloquante ou bloquante. Socket_Set_Block est l'une des fonctions très importantes qui peuvent nous aider à définir une prise sur le mode de blocage, ce qui est très utile pour certains besoins de communication réseau.
Dans les modes de programmation réseau, de blocage et de non-blocage, déterminez le comportement d'un programme lors de l'exécution des opérations de socket.
Mode de blocage : Dans ce mode, le programme attendra que l'opération se termine (telle que la lecture ou l'écriture de données) et ne continuera pas à exécuter tant que l'opération ne sera pas réussie ou qu'une erreur se produit. Cela signifie que s'il n'y a pas de données à lire, le programme attendra.
Mode non bloquant : Dans ce mode, le programme n'attend pas la fin de l'opération. Si les données sont temporairement indisponibles, l'opération de socket renvoie immédiatement une erreur ou une valeur d'état spécifique, permettant au programme de continuer à effectuer d'autres tâches.
La fonction socket_set_block est utilisée pour définir une prise qui a été créée en mode de blocage. Ceci est très utile lors de la gestion de certaines demandes de réseau, surtout lorsque nous voulons que le programme attende que les données reviennent normalement. Il convient de noter que la fonction socket_set_block ne nécessite pas de paramètres supplémentaires pour spécifier le comportement de blocage spécifique. Il ne définit la prise que sur le mode de blocage via un seul appel.
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_set_block</span></span><span> ( resource </span><span><span class="hljs-variable">$socket</span></span><span> );
</span></span>
$ socket : la ressource de socket à définir sur le mode de blocage.
Cette fonction renvoie true pour indiquer que le paramètre est réussi et renvoie False pour indiquer que le paramètre est échoué. Si le paramètre échoue, vous pouvez utiliser socket_last_error () pour obtenir des informations d'erreur spécifiques.
Voici un exemple simple montrant comment utiliser socket_set_block pour définir une connexion TCP en mode de blocage:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// créer TCP Prises</span></span><span>
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$socket</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Socket créer失败: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// Connectez-vous au serveur cible</span></span><span>
</span><span><span class="hljs-variable">$address</span></span><span> = </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_connect</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$address</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Échec de la connexion: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// 将Prises设置为阻塞模式</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">socket_set_block</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Prises已成功设置为阻塞模式。\n"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"设置Prises为阻塞模式失败。\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// Envoyer des données</span></span><span>
</span><span><span class="hljs-variable">$message</span></span><span> = </span><span><span class="hljs-string">"Hello, Server!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_write</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$message</span></span><span>, </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$message</span></span><span>));
</span><span><span class="hljs-comment">// Recevoir une réponse</span></span><span>
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_read</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Réponse du serveur: <span class="hljs-subst">$response</span></span></span><span>\n";
</span><span><span class="hljs-comment">// 关闭Prises</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Dans cet exemple, nous créons d'abord une prise TCP et nous nous connectons à un serveur via socket_connect (en supposant que l'IP est 127.0.0.1 et le port est 8080 ). Nous définissons ensuite la prise sur le mode de blocage à l'aide de socket_set_block , puis envoyons un message et attendons la réponse du serveur.
Effets du mode de blocage :
En mode blocage, des opérations telles que socket_read ou socket_write bloquent le processus actuel jusqu'à ce qu'ils se terminent ou l'allumage. Par conséquent, lors du traitement des connexions sans réponse pendant longtemps, le programme peut ne pas répondre.
Il est nécessaire de s'assurer que la vitesse de réponse côté serveur est contrôlable, sinon le mode de blocage peut conduire à de graves goulots d'étranglement de performances dans des environnements réseau avec des connexions à haute latence ou instables.
Commutation avec le mode non bloquant :
Si vous avez réglé la prise sur le mode non bloquant (via la fonction socket_set_nonblock ), vous pouvez utiliser socket_set_block pour le revenir en mode de blocage. Cependant, il est important de noter que les modes de commutation peuvent affecter le comportement de connexion existant.
Gestion des erreurs :
Lorsque vous utilisez socket_set_block , vous devez faire attention à la vérification de la valeur de retour de la fonction. Si le paramètre échoue, vous pouvez utiliser socket_last_error pour obtenir le code d'erreur spécifique et prendre des mesures correspondantes en conséquence.
Scénarios applicables :
Le mode de blocage convient généralement aux scénarios de transmission de données qui nécessitent l'ordre et l'intégrité, tels que les modèles de réseau traditionnels que la réponse du client-serveur client. Dans ce mode, le client attendra que le serveur renvoie les données avant d'effectuer l'opération suivante.
SOCKET_SET_BLOCK est une fonction simple et efficace en PHP qui définit les sockets en mode de blocage pour s'assurer que le programme attend que l'opération se termine lors de l'exécution des opérations de socket. Ceci est très utile pour certains scénarios de communication réseau, en particulier ceux qui doivent attendre que le serveur réponde et traite. Dans une utilisation réelle, les développeurs doivent choisir des modes de blocage ou de non-blocage en fonction de leurs propres besoins pour garantir l'efficacité et la stabilité de la communication réseau.