Position actuelle: Accueil> Derniers articles> Utilisez socket_set_block pour construire des programmes de chat de blocage de blocage

Utilisez socket_set_block pour construire des programmes de chat de blocage de blocage

gitbox 2025-05-29

En PHP, la programmation de socket est l'un des moyens de base pour réaliser la communication réseau. Par défaut, les prises peuvent ne pas bloquer, ce qui signifie que lorsqu'il n'y a pas de données, l'opération de lecture revient immédiatement au lieu d'attendre que les données arrivent. La prise de blocage fera attendre le programme lors de la lecture des données jusqu'à la lecture des données, ce qui convient à la mise en œuvre d'un programme de chat synchrone simple.

Cet article présentera comment utiliser la fonction Socket_Set_Set_Set_Set de PHP pour définir Socket sur le mode de blocage et implémenter un exemple de programme de chat de blocage simple basé sur cela.

Qu'est-ce qu'une prise de blocage?

Une prise de blocage fait référence à la pause du programme et en attendant que les données arrivent ou que l'opération soit terminée lors de l'exécution d'une opération de lecture ou d'écriture. Cette méthode est simple à implémenter et à effacer la logique, ce qui le rend idéal pour les débutants et les applications de chat à petite échelle.

En revanche, les prises non bloquantes nécessitent un sondage d'événements ou des opérations asynchrones, qui sont logiquement complexes mais sont plus adaptées aux exigences de haute performance.

Introduction à la fonction socket_set_block

SOCKET_SET_BLOCK est une fonction en PHP qui définit le mode de blocage de socket. Après avoir appelé cette fonction, la prise passera à l'état de blocage.

Prototype de fonction:

 bool socket_set_block(resource $socket)
  • $ socket : la ressource de socket qui doit être définie

  • Valeur de retour: renvoyer vrai pour le succès, renvoyer false pour l'échec

Exemple de programme de chat de socket de blocage

Vous trouverez ci-dessous un exemple de serveur de chat de socket de blocage simple. Le client peut envoyer des messages après la connexion, et le serveur résonne simplement après les avoir reçu.

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

// créer Socket
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($sock === false) {
    die("socket_create() échouer: " . socket_strerror(socket_last_error()));
}

// Adresse et port de lier
if (!socket_bind($sock, $host, $port)) {
    die("socket_bind() échouer: " . socket_strerror(socket_last_error($sock)));
}

// Écouter le port
if (!socket_listen($sock, 5)) {
    die("socket_listen() échouer: " . socket_strerror(socket_last_error($sock)));
}

echo "Startup de serveur,moniteur {$host}:{$port}...\n";

// Acceptez les connexions du client
$client = socket_accept($sock);
if ($client === false) {
    die("socket_accept() échouer: " . socket_strerror(socket_last_error($sock)));
}

// Configuration du client Socket En mode blocage
socket_set_block($client);

echo "La connexion du client est réussie,En attendant le message...\n";

while (true) {
    // Bloquer la lecture des données du client
    $data = socket_read($client, 2048, PHP_NORMAL_READ);
    if ($data === false) {
        echo "socket_read() échouer: " . socket_strerror(socket_last_error($client)) . "\n";
        break;
    }

    $data = trim($data);
    if ($data === '') {
        continue;
    }
    
    echo "A reçu un message client: $data\n";

    if ($data === 'quit') {
        echo "Déconnexion du client\n";
        break;
    }

    // Faire écho au message au client
    $response = "Le serveur a été reçu: $data\n";
    socket_write($client, $response, strlen($response));
}

// fermeture Socket connecter
socket_close($client);
socket_close($sock);
?>

Courir et tester

  1. Enregistrez le code ci-dessus sous server.php et exécutez-le sur la ligne de commande:

 php server.php
  1. Connectez-vous à l'aide de Telnet ou d'un autre client TCP:

 telnet gitbox.net 12345

(Dans cet exemple, le port est 12345, et l'exemple de nom de domaine est modifié en gitbox.net )

  1. Entrez un message, le serveur bloquera et attendra votre entrée et reviendra pour confirmer après avoir reçu le message.

  2. Entrez QUIT pour déconnecter.

Résumer

L'utilisation de socket_set_block rend très pratique de définir Socket sur le mode de blocage, permettant une logique de chat synchrone simple. Le blocage de la programmation convient aux débutants pour commencer rapidement avec la programmation réseau, mais dans les scénarios de concurrence élevés, les méthodes non bloquantes ou asynchrones sont plus efficaces.

Pour plus d'informations sur la programmation PHP Socket, vous pouvez visiter:

 https://gitbox.net/manual/socket