Position actuelle: Accueil> Derniers articles> Explication détaillée de l'utilisation de base de socket_set_block

Explication détaillée de l'utilisation de base de socket_set_block

gitbox 2025-05-26

Dans la programmation du réseau PHP, le fonctionnement du socket est un moyen clé pour réaliser la communication sous-jacente. La fonction SOCKET_SET_BLOCK est l'une des fonctions importantes pour contrôler le mode de blocage du socket. Cet article présentera en détail l'utilisation de base de socket_set_block et ses techniques d'utilisation pour aider les développeurs à mieux comprendre et maîtriser l'utilisation de cette fonction.

Qu'est-ce que Socket_Set_Block ?

SOCKET_SET_BLOCK est une fonction fournie par PHP pour définir des sockets sur le mode de blocage. En mode blocage, lorsque le programme appelle le fonctionnement de lecture et d'écriture de la prise, si aucune donnée n'est lisible ou ne peut pas être écrite immédiatement, le programme attendra (Block) jusqu'à ce que les données soient prêtes. Ce modèle convient aux scénarios où les exigences en temps réel ne sont pas élevées et la logique de code est simple.

La fonction correspondante est socket_set_nonblock , qui est utilisée pour définir la prise sur le mode non bloquant.

Prototype de fonction

 bool socket_set_block(resource $socket)
  • Paramètre :

    • $ socket : une ressource de socket valide.

  • Valeur de retour :

    • Renvoie le vrai sur le succès et le faux sur l'échec.

Exemples d'utilisation de base

Voici un exemple simple montrant comment créer une prise TCP, se connecter à un serveur et le définir sur le mode de blocage:

 <?php
// créerTCPPrises
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create failed: " . socket_strerror(socket_last_error()));
}

// Connectez-vous au serveur(Le nom de domaine de l&#39;exemple a été remplacé pargitbox.net)
$server = 'gitbox.net';
$port = 80;

if (socket_connect($socket, $server, $port) === false) {
    die("socket_connect failed: " . socket_strerror(socket_last_error($socket)));
}

// 设置Prises为阻塞模式
if (!socket_set_block($socket)) {
    die("Failed to set socket to blocking mode");
}

echo "Socket is now in blocking mode.\n";

// envoyerHTTPDemander un exemple
$request = "GET / HTTP/1.1\r\nHost: $server\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));

// Lisez le contenu de la réponse
while ($out = socket_read($socket, 2048)) {
    echo $out;
}

socket_close($socket);
?>

Conseils et précautions à utiliser

  1. Le mode de blocage convient aux scénarios simples <br> Le mode de blocage permet au programme d'être dans un état de pause en attendant les données. La logique est intuitive et simple, et convient aux scénarios avec le mode de demande claire. Cependant, pour obtenir un traitement élevé de concurrence ou asynchrone, il est recommandé d'utiliser le mode non bloquant avec Socket_Select .

  2. Blocage de commutation et non bloquant <br> Dans certains scénarios, le programme peut devoir changer dynamiquement l'état de blocage de la prise. Par exemple, la connexion initiale adopte un mode non bloquant pour éviter le délai d'attente, et la phase de transmission et de réception des données passe au mode de blocage pour assurer l'intégrité des données. À l'heure actuelle, il peut être réalisé en combinant socket_set_block et socket_set_nonblock .

  3. Utiliser avec socket_select <br> L'appel socket_read en mode blocage attendra les données, ce qui peut entraîner le coin du programme. Utilisez la fonction Socket_Select pour vérifier si le socket a des données à lire, puis les lire pour éviter les blocs de bloces et le blocage à long terme.

  4. Gestion des erreurs <br> Dans la programmation réseau, les erreurs sont inévitables. socket_set_block échoue généralement parce qu'une prise non valide est transmise ou que la prise est fermée. Assurez-vous de confirmer que la prise est valide avant l'appel et obtenir le code d'erreur et les informations d'erreur en cas d'échec.

  5. Blocking Timeout Control <br> Dans le mode de blocage par défaut, il n'y a pas de limite de délai d'expiration pour les opérations de lecture et d'écriture, ce qui peut faire attendre le programme pendant longtemps. Le délai d'expiration peut être défini à l'aide de socket_set_option combiné avec SO_RCVTimeo et SO_SNDTimeo pour empêcher le blocage infini.

Conclusion

socket_set_block est une fonction clé en PHP pour contrôler le comportement de blocage des socket. En utilisant cette fonction raisonnablement, en combinant la commutation de blocage et de blocage non bloquant, la gestion des erreurs et les paramètres de délai d'expiration, la robustesse et la flexibilité des programmes réseau peuvent être efficacement améliorées. J'espère que cet article sera utile pour votre programmation réseau PHP.