Par défaut, les prises en PHP sont en mode de blocage, l'appel Socket_Connect bloquera jusqu'à ce que la connexion soit réussie ou échouée à revenir. Mais si vous souhaitez vous assurer que les opérations de lecture et d'écriture suivantes restent bloquées après la connexion, vous pouvez utiliser socket_set_block pour le définir explicitement.
Il convient de noter que socket_set_block doit être appelé après socket_connect pour prendre effet. parce que:
Réglage du mode de blocage avant l'établissement de connexion peut être réinitialisé par socket_connect .
Le réglage après la connexion garantit que toutes les opérations suivantes sont en mode de blocage.
Voici un exemple complet montrant comment appeler socket_set_block une fois une connexion réussie:
<?php
// Créer un TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create échouer: " . socket_strerror(socket_last_error()) . "\n");
}
// Connectez-vous au serveur
$address = 'gitbox.net';
$port = 80;
if (!socket_connect($socket, $address, $port)) {
die("socket_connect échouer: " . socket_strerror(socket_last_error($socket)) . "\n");
}
// Après une connexion réussie,Définir le mode de blocage
if (!socket_set_block($socket)) {
die("socket_set_block échouer: " . socket_strerror(socket_last_error($socket)) . "\n");
}
// Maintenant socket C'est bloqué,Les opérations de lecture et d'écriture peuvent être effectuées
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));
// Lisez la réponse
$response = '';
while ($out = socket_read($socket, 2048)) {
$response .= $out;
}
// fermeture socket
socket_close($socket);
// Réponse de sortie
echo $response;
?>
Assurez-vous que socket_set_block est appelé après que socket_connect réussisse pour éviter de le régler après la défaillance de la connexion.
socket_set_block renvoie une valeur booléenne et le message d'erreur peut être obtenu via socket_last_error en cas d'échec.
Si vous appelez socket_set_block avant la connexion, il peut être écrasé par des appels internes pendant la connexion, ce qui entraîne des paramètres de blocage non valides.
Le mode de socket par défaut de PHP est généralement bloque, mais dans certains scénarios (tels que socket_set_nonblock qui a été appelé auparavant), il doit être réinitialisé au blocage.
En résumé, si vous souhaitez vous assurer que le mode de blocage prend effet, la clé consiste à appeler socket_set_block après le succès de socket_connect , afin de s'assurer que les opérations de lecture et d'écriture ultérieures sont effectuées de manière bloquante, évitant ainsi des problèmes communs tels que l'incapacité à lire les données ou à ne pas écrire de mode non bloquant.