Position actuelle: Accueil> Derniers articles> Utilisez socket_set_block pour implémenter un système de messagerie avec un flux de contrôle

Utilisez socket_set_block pour implémenter un système de messagerie avec un flux de contrôle

gitbox 2025-05-29

1. Qu'est-ce que socket_set_blocking?

La fonction Socket_Set_Blocking dans PHP est utilisée pour définir le mode de blocage d'une ressource de socket:

  • Mode de blocage: lors de l'appel des fonctions liées à la prise, attendez que l'opération se termine et que le programme s'arrête pendant cette période.

  • Mode non bloquant: renvoie immédiatement lors de l'appel des fonctions liées à la prise et n'attend pas la fin de l'opération.

Par défaut, Socket bloque. Le mode de blocage convient aux scénarios de synchronisation simples, mais pour les serveurs haute performance, un mécanisme de flux de contrôle plus détaillé est nécessaire.

 bool socket_set_blocking ( resource $socket , bool $mode )
  • $ socket : ressource de socket.

  • MODE $ : Vrai signifie blocage, faux signifie non bloquant.


2. La signification du flux de contrôle

Le flux de contrôle gère le rythme d'envoi et de réception des messages pour empêcher les messages d'être envoyés trop rapidement, entraînant une congestion du réseau, une utilisation excessive des ressources ou une perte de message. Les conceptions avec flux de contrôle peuvent réaliser:

  • Tamponner de la file d'attente de la file d'attente, envoyant étape par étape.

  • Basculez dynamiquement entre les modes de blocage et de non-blocage.

  • Mécanisme de retenue de la manipulation et des erreurs de l'erreur.


3. Idées de conception

  • Le serveur et le client utilisent le mode de blocage pour assurer la stabilité de l'envoi et de la réception.

  • Faites la queue le message envoyé et envoyez-le uniquement lorsqu'il y a des données dans le tampon d'envoi pour empêcher le blocage et l'attente.

  • Le récepteur définit un délai d'expiration raisonnable pour éviter les pendants à long terme.

  • Utilisez Socket_Select pour atteindre le multiplexage, surveiller les événements de lecture et d'écriture et améliorer l'efficacité.


4. Exemple de code

Ce qui suit est un exemple simplifié du serveur de socket PHP basé sur TCP, qui montre comment utiliser socket_set_blocking pour contrôler le mode de blocage pour réaliser le contrôle de flux de la messagerie:

 <?php
$host = "0.0.0.0";
$port = 12345;

// créersocket
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, $host, $port);
socket_listen($sock);

echo "Server started at $host:$port\n";

// Configuration de la surveillancesocketEn mode blocage,En attente du client lors de l&#39;acceptation de la connexion
socket_set_blocking($sock, true);

$clients = [];

while (true) {
    // utiliser socket_select Écoutez les connexions actives
    $read = $clients;
    $read[] = $sock; // Rejoignez le moniteursocket
    $write = [];
    $except = null;

    // Bloquer en attente d&#39;activitésocket
    if (socket_select($read, $write, $except, 5) < 1) {
        continue; // Timeout Aucune activité
    }

    // Traiter de nouvelles connexions
    if (in_array($sock, $read)) {
        $newClient = socket_accept($sock);
        if ($newClient !== false) {
            socket_set_blocking($newClient, true); // Configuration du clientsocketPour bloquer,Message complet garanti
            $clients[] = $newClient;
            echo "New client connected\n";
        }
        unset($read[array_search($sock, $read)]);
    }

    // Traiter les messages clients existants
    foreach ($read as $client) {
        $data = socket_read($client, 2048, PHP_NORMAL_READ);
        if ($data === false || $data === '') {
            // Déconnexion du client
            echo "Client disconnected\n";
            socket_close($client);
            unset($clients[array_search($client, $clients)]);
            continue;
        }
        $data = trim($data);
        echo "Received: $data\n";

        // Écho simple,Avec contrôle de flux:Assurez-vous avant d&#39;envoyersocketMode de blocage,Empêcher les échecs d&#39;écriture
        socket_set_blocking($client, true);
        $sendResult = socket_write($client, "Echo: $data\n");
        if ($sendResult === false) {
            echo "Failed to send message to client\n";
        }
    }
}

5. Points de conception de contrôle de flux pour le code d'analyse

  • Commutation du mode de blocage <br> La prise d'écoute et la prise client sont définies sur le blocage, afin que l'intégrité des données puisse être garantie lors de la lecture et de l'écriture de données, et éviter les messages incomplets en raison de la lecture courte et des écritures courtes en mode non bloquant.

  • socket_select écouter le multiplexage
    Socket_Select bloque et attend qu'une douille est lisible, améliorant l'utilisation du processeur et évitant le gaspillage de ressources dans une boucle morte.

  • Contrôle de la file d'attente de messages (extensible)
    Bien qu'il soit lu et écrit directement dans l'exemple, une file d'attente de messages peut être ajoutée en fonction des besoins pour contrôler la taille et la fréquence de chaque message envoyé pour éviter la congestion du réseau client.


6. Autres suggestions d'optimisation

  • Utilisez le mode non bloquant pour coopérer avec les bibliothèques axées sur les événements (telles que LiBevent) pour améliorer les performances élevées de concurrence.

  • Introduire le numéro de série du message et le mécanisme de confirmation pour assurer l'intégrité de la transmission de messages.

  • Implémentez l'état de la connexion de détection de paquets de battements cardiaques.

  • Utilisez socket_set_option pour optimiser les paramètres TCP, tels que le réglage TCP_NODELAY pour réduire la latence.


7. Conclusion

En utilisant rationnellement la fonction Socket_set_set_set_set_set et en combinant le mécanisme d'écoute des événements Socket_Select , un système de messagerie et de réception efficace avec un flux de contrôle peut être construit. Le flux de contrôle assure non seulement la stabilité de la transmission des messages, mais améliore également la vitesse de réponse du système et l'utilisation des ressources. J'espère que les exemples et les idées de cet article vous seront utiles dans la construction de votre propre système de messages.