Position actuelle: Accueil> Derniers articles> Créer un serveur de blocage dans PHP: de socket_create à socket_set_block

Créer un serveur de blocage dans PHP: de socket_create à socket_set_block

gitbox 2025-05-26

La mise en œuvre d'un serveur de blocage basé sur des douilles dans PHP peut nous aider à comprendre le principe de communication du réseau sous-jacent. Le mode de blocage signifie que le serveur attendra que les données soient lues ou écrites jusqu'à ce que les données puissent être traitées ou que la connexion soit prête. Cet article analysera pas par étape comment utiliser l'extension de socket de PHP, de la création de sockets au réglage en mode blocage et de créer un serveur de blocage simple.

1. Préparation: Assurer l'extension de la prise est activée

Tout d'abord, assurez-vous que l'extension de socket est activée dans l'environnement PHP. Trouvez et décommentez la ligne suivante dans php.ini (le cas échéant):

 extension=sockets

Utilisez la commande php -m pour vérifier si l'extension est activée:

 php -m | grep sockets

Si vous pouvez voir des sockets , l'extension est activée.

2. Créez un serveur TCP à l'aide de Socket

Voici les étapes de base pour créer une prise et étape par étape introduire le rôle de chaque fonction.

1. Créez une prise

 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create() failed: " . socket_strerror(socket_last_error()) . "\n");
}

Ici, nous créons un socket TCP ( sock_stream ) basé sur IPv4 ( af_inet ).

2. Définir les options de socket (en option)

Certaines options de socket peuvent être définies, telles que la réutilisation du port:

 socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);

3. Bind Pocket

 $host = '0.0.0.0';
$port = 9000;
if (!socket_bind($socket, $host, $port)) {
    die("socket_bind() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}

4. Écoutez le port

 if (!socket_listen($socket, 5)) {
    die("socket_listen() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}

5 Indique le nombre maximum de demandes de connexion en attente.

3. Réglé sur le mode de blocage

Utilisez socket_set_block pour définir le socket sur le mode de blocage.

 if (!socket_set_block($socket)) {
    die("socket_set_block() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}

Une fois défini sur le mode de blocage, socket_accept ultérieur, socket_read et autres fonctions bloqueront jusqu'à la fin de l'opération.

4. Accepter la connexion et lire les données

 echo "Le serveur est démarré,Écouter le port $port...\n";

while (true) {
    $clientSocket = socket_accept($socket);
    if ($clientSocket === false) {
        echo "socket_accept() failed: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    $input = socket_read($clientSocket, 1024);
    if ($input === false) {
        echo "socket_read() failed: " . socket_strerror(socket_last_error($clientSocket)) . "\n";
    } else {
        $input = trim($input);
        echo "A reçu un message: $input\n";

        $response = "Tu l'as envoyé:$input\n";
        socket_write($clientSocket, $response, strlen($response));
    }

    socket_close($clientSocket);
}

5. Arrêtez le serveur

N'oubliez pas de fermer la prise principale lorsque vous devez quitter:

 socket_close($socket);

6. Test d'accès

Vous pouvez utiliser un client de ligne de commande tel que Telnet Connection Test:

 telnet gitbox.net 9000

Ou écrivez un client PHP simple pour les tests de connexion.

Résumer

Par socket_create à socket_set_block , nous construisons un serveur de blocage complet. Ce mode convient aux applications de communication réseau simples, telles que l'enseignement, le débogage ou les scénarios à faible monnaie. Pour les scénarios de concurrence élevés, il est recommandé d'utiliser le mode non bloquant ou d'utiliser SELECT / POLL pour obtenir des boucles d'événements plus efficaces.

Grâce aux étapes pratiques de cet article, vous pouvez maîtriser l'ensemble du processus de construction de serveurs de blocage dans PHP et présenter une base solide pour une programmation réseau approfondie.