Position actuelle: Accueil> Derniers articles> socket_set_option et socket_select sont utilisés en combinaison pour atteindre le multiplexage

socket_set_option et socket_select sont utilisés en combinaison pour atteindre le multiplexage

gitbox 2025-05-26

Dans la programmation réseau PHP, la gestion du multiplexage est une technologie clé pour obtenir des services de réseau efficaces. socket_set_option et socket_select sont deux fonctions importantes dans la programmation de socket PHP. De nombreux développeurs se demanderont s'ils peuvent être utilisés ensemble, en particulier comment correspondre correctement lors de la mise en œuvre du multiplexage.

Cet article expliquera en détail le rôle de socket_set_option et de socket_select , discutera de leur utilisation ensemble et introduire comment les utiliser pour atteindre le multiplexage.


1. Les fonctions de base de socket_set_option et socket_select

socket_set_option

SOCKET_SET_OPTION est utilisé pour définir des options pour les sockets, tels que le délai d'expiration, que ce soit pour réutiliser l'adresse, envoyer / recevoir la taille du tampon, etc. Sa fonction est d'ajuster les caractéristiques comportementales de la prise.

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

Le code ci-dessus définit l'option de réutilisation d'adresse pour socket, qui est souvent utilisée pour lier rapidement les ports lorsque le serveur redémarre.

socket_select

Socket_Select est une fonction clé pour implémenter le multiplexage. Il est utilisé pour écouter plusieurs prises, et lorsqu'une ou plusieurs des prises sont prêtes à lire et à écrire, la fonction revient. Cela permet à un programme unique de gérer simultanément plusieurs connexions.

 $read = [$socket1, $socket2];
$write = null;
$except = null;
$timeout = 5;

$num_changed = socket_select($read, $write, $except, $timeout);

Socket_Select renvoie les sockets préparés en modifiant les tableaux $ read , $ write et $ sauf .


2. Socket_set_option et socket_select peut-il être utilisé ensemble?

La réponse est oui , mais les fonctions des deux sont différentes. Lorsqu'il est utilisé ensemble, vous devez clairement distinguer les utilisations:

  • Socket_set_option est utilisé pour configurer le comportement du socket (tels que les délais d'expiration, les tampons, etc.).

  • Socket_Select est utilisé pour écouter si plusieurs prises sont lisibles, écrivables ou ont des exceptions.

Le multiplexage repose principalement sur socket_select , tandis que socket_set_option ajuste uniquement les propriétés du socket, généralement définie après la création du socket et avant que Socket_Select soit utilisé.


3. Utilisez socket_set_option pour implémenter des exemples de multiplexage avec socket_select

Ce qui suit est un exemple de serveur simple montrant comment définir des options de socket avec socket_set_option lors de l'utilisation de socket_select sur l'écoute multiplexée multiplexée pour plusieurs connexions client.

 <?php
// créer TCP socket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);

// Port de lier
socket_bind($server, '0.0.0.0', 8080);
socket_listen($server);

$clients = [];
$read = [$server];

while (true) {
    $readSockets = $read;
    $write = null;
    $except = null;

    // Écoutez plusieurs socket Changements
    $numChanged = socket_select($readSockets, $write, $except, 5);

    if ($numChanged === false) {
        echo "socket_select Une erreur s&#39;est produite\n";
        break;
    } elseif ($numChanged > 0) {
        // Écoutez une nouvelle connexion client
        if (in_array($server, $readSockets)) {
            $newClient = socket_accept($server);
            if ($newClient !== false) {
                socket_set_option($newClient, SOL_SOCKET, SO_RCVTIMEO, ["sec"=>5, "usec"=>0]);
                $clients[] = $newClient;
                $read[] = $newClient;
                echo "NOUVEAU CONNEXION CLIENT\n";
            }
            unset($readSockets[array_search($server, $readSockets)]);
        }

        // Traiter les données envoyées par les clients existants
        foreach ($readSockets as $socket) {
            $data = socket_read($socket, 1024, PHP_NORMAL_READ);
            if ($data === false || $data === '') {
                // La connexion se ferme
                socket_close($socket);
                unset($clients[array_search($socket, $clients)]);
                unset($read[array_search($socket, $read)]);
                echo "Client déconnecté\n";
            } else {
                $data = trim($data);
                echo "Données du client reçu: $data\n";
                // Envoyer une réponse
                socket_write($socket, "Le serveur a été reçu: $data\n");
            }
        }
    }
}
socket_close($server);

Description des points clés:

  • Le serveur Socket $ Server définit SO_REUSEADDR avec socket_set_option pour garantir une réutilisation rapide du port.

  • Une fois la nouvelle connexion client établie, l'option de délai de réception est également définie avec socket_set_option .

  • SOCKET_SELECT écoute toutes les prises clients actives et les prises de serveur pour s'assurer que le mécanisme de multiplexage fonctionne correctement.


4. Conclusion

  • Les fonctions socket_set_option et socket_select sont différentes, mais elles peuvent et doivent être utilisées en combinaison.

  • Socket_set_option est responsable de la configuration des paramètres de socket et de l'optimisation des performances et du comportement du réseau.

  • Socket_Select est responsable du multiplexage et de l'écoute de plusieurs événements de socket.

  • L'utilisation de ces deux fonctions peut raisonnablement rédiger des programmes de serveur réseau efficaces et stables.


Si vous souhaitez apprendre le multiplexage du socket PHP en profondeur, vous pouvez également vous référer à des documents officiels et à des livres de programmation réseau connexes pour maîtriser plus de détails et de compétences avancées.


Le nom de domaine URL de l'exemple de l'article est le suivant:

 $url = "https://gitbox.net/api/socket_demo";