Position actuelle: Accueil> Derniers articles> Comment combiner socket_create, socket_bind et socket_set_block

Comment combiner socket_create, socket_bind et socket_set_block

gitbox 2025-05-28

Dans la programmation de socket de PHP, la fonction socket_set_block () est utilisée pour définir la prise sur le mode de blocage. En mode blocage, les opérations d'E / S telles que socket_accept () ou socket_read ( ) attendront que les données soient disponibles ou que la connexion soit terminée, ce qui est particulièrement important dans les programmes de serveur qui doivent synchroniser les demandes des clients.

Cet article combinera socket_create () et socket_bind () pour montrer comment créer un serveur de socket basé sur le mode de blocage.

1. Introduction à socket_set_block

socket_set_block (Resource $ socket): bool

Cette fonction définit la prise spécifiée en mode de blocage, et la valeur de retour est booléen, indiquant si le paramètre est réussi.

Le mode de blocage est le comportement par défaut, mais si vous avez déjà appelé socket_set_nonblock () , vous devez utiliser socket_set_block () pour restaurer.

2. Exemple complet de l'implémentation des connexions en mode de blocage

Vous trouverez ci-dessous un exemple complet de serveur PHP, en utilisant des fonctions telles que socket_create () , socket_bind () , socket_listten () et socket_accept () , et définir explicitement le mode de blocage.

<code> & lt ;? Php // Créer un socket tcp $ socket = socket_create (af_inet, sock_stream, sol_tcp); if ($ socket === false) {die ("socket_create () a échoué:". socket_strorror (socket_last_error ()). "\ n"); }

// réglé sur le mode de blocage
if (! socket_set_block ($ socket)) {
Die ("Impossible de définir sur le mode de blocage:". Socket_Sstreror (socket_last_error ($ socket)). "\ n");
}

// lier la propriété intellectuelle et le port
$ host = '0.0.0.0';
$ port = 12345;
if (! socket_bind ($ socket, $ host, $ port)) {
die ("socket_bind () a échoué:". socket_strorror (socket_last_error ($ socket)). "\ n");
}

// écoute la connexion
if (! socket_Listen ($ socket, 5)) {
die ("socket_listten () a échoué:". socket_strorror (socket_last_error ($ socket)). "\ n");
}

Echo "Le serveur démarre, écoutez dans {$ host}: {$ port} ... \ n";

while (true) {
Echo "En attente de la connexion client ... \ n";
$ client = socket_accept ($ socket);
if ($ client === false) {
Echo "socket_accept () a échoué:". socket_streror (socket_last_error ($ socket)). "\ n";
continuer;
}

 echo "Le client est connecté,Données de lecture...\n";

// Lire les messages du client(Bloquer jusqu&#39;à ce que les données soient reçues)
$input = socket_read($client, 1024);
echo "A reçu un message: " . trim($input) . "\n";

$response = "Bienvenue pour se connecter au serveur!Tu as envoyé:" . trim($input);
socket_write($client, $response, strlen($response));

socket_close($client);

}

// ferme la prise principale
socket_close ($ socket);
</code>

3. Méthode de test du client

Vous pouvez utiliser l'outil Telnet pour vous connecter au serveur:

 telnet 127.0.0.1 12345

Entrez n'importe quel texte et le serveur répondra à ce que vous avez envoyé.

4. Scénarios d'application pratiques

Le mode de blocage convient aux scénarios suivants:

  • Modèle de serveur série simple

  • Une seule connexion client est traitée à la fois

  • Services qui nécessitent peu de temps réel

Cependant, pour les applications simultanées élevées, il est généralement recommandé d'utiliser le mode non bloquant en conjonction avec des méthodes multi-processus ou asynchrones.

5. Conseils

Dans le débogage et le déploiement, il est recommandé de produire des informations d'erreur de socket en combinaison avec des fichiers Error_log ou journaux pour localiser rapidement les problèmes. Par exemple, les erreurs peuvent être écrites dans un fichier:

 error_log("socket_error: " . socket_strerror(socket_last_error()), 3, "/var/log/php_socket_error.log");

6. Résumé

Via socket_set_block () , nous pouvons contrôler de manière flexible le comportement d'E / S de socket. Dans certains cas, la définition explicite du mode de blocage peut éviter les problèmes d'exception en raison des modifications de comportement par défaut. Lorsqu'il est combiné avec socket_create () et socket_bind () , assurez-vous que l'ordre logique est correct, c'est-à-dire, créez d'abord, puis liez, puis définissez le mode d'écoute et de blocage, créant ainsi un programme de serveur de socket stable.

Dans l'exemple ci-dessus, si vous le déployez sur le serveur, vous pouvez envoyer un test de connexion à http://gitbox.net:12345 via un navigateur ou une demande d'API (en fait en fonction de votre configuration IP et port).

J'espère que cet article sera utile pour que vous compreniez l'utilisation de socket_set_block () .