Position actuelle: Accueil> Derniers articles> socket_set_block construit un mécanisme de connexion à haute disponibilité avec les paramètres de délai d'expiration

socket_set_block construit un mécanisme de connexion à haute disponibilité avec les paramètres de délai d'expiration

gitbox 2025-05-26

Lors de la création de services de réseau hautement disponibles, les fonctions de socket fournies par PHP fournissent aux développeurs de fortes capacités de contrôle sous-jacentes. socket_set_block () est l'une des fonctions importantes qui définissent le socket sur le mode de blocage, contrôlant ainsi le comportement d'attente du programme lors de la lecture ou de l'écriture de données. Avec un mécanisme de délai d'expiration raisonnable, nous pouvons créer une solution de gestion de connexion robuste et très disponible.

La différence entre le blocage et le non-bloquant

Lors de la programmation avec la douille de PHP, il existe des différences essentielles dans le comportement des modes de blocage et de non-blocage:

  • Mode de blocage : lors d'une opération de lecture ou d'écriture, si aucune donnée ou connexion n'est disponible, le programme "attendra" jusqu'à ce que la condition soit remplie ou qu'une erreur se produise.

  • Mode non bloquant : l'opération revient immédiatement et n'attend pas. Cela oblige les développeurs à gérer des détails tels que l'état de la connexion, la préparation des données, etc. à l'extérieur.

La fonction de socket_set_block () est de définir explicitement le socket sur le mode de blocage pour s'assurer que l'opération sera terminée lors de l'appel socket_read () ou socket_write () .

Exigences pour les mécanismes de connexion à haute disponibilité

Le mécanisme de connexion à haute disponibilité devrait avoir les caractéristiques suivantes:

  • Peut détecter si la connexion est accessible dans le temps;

  • Évitez la gamme à long terme du programme en raison du blocage;

  • En cas de problèmes de serveur ou de réseau, changez rapidement ou réessayez;

  • Libération de ressources raisonnable et gestion des exceptions.

À l'heure actuelle, le mode de blocage combiné avec le paramètre de délai d'expiration est particulièrement critique. PHP fournit la fonction socket_set_option () pour définir l'heure du délai d'expiration.

Plan de mise en œuvre

Ce qui suit est une logique d'implémentation typique, les étapes sont les suivantes:

  1. Créer une prise;

  2. Définir l'heure du délai d'expiration;

  3. Réglé sur le mode de blocage;

  4. Essayez de se connecter;

  5. Vérifier l'état de la connexion;

  6. Traitement normal de lecture et d'écriture ou de délai d'attente.

L'exemple de code est le suivant:

 <?php

$host = 'gitbox.net';
$port = 80;

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

// Définir le temps de délai de connexion(Secondes)
$timeout = ['sec' => 5, 'usec' => 0];
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeout);

// Défini sur le mode de blocage
socket_set_block($socket);

// Lancer une connexion
$result = @socket_connect($socket, $host, $port);
if ($result === false) {
    $errorCode = socket_last_error($socket);
    $errorMsg = socket_strerror($errorCode);
    echo "Échec de la connexion: [$errorCode] $errorMsg\n";
    socket_close($socket);
    exit;
}

// Envoyez une demande après une connexion réussie
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));

// Lisez la réponse
$response = '';
while ($chunk = socket_read($socket, 2048)) {
    $response .= $chunk;
}

echo "Réponse du serveur:\n$response";

socket_close($socket);
?>

Description des points clés

  • socket_set_option () configure le délai d'expiration pour lire et envoyer. Si l'hôte cible ne répond pas, il ne bloquera pas indéfiniment.

  • socket_set_block () garantit que les opérations de lecture et d'écriture sont conformes à la logique séquentielle et ne nécessitent pas de sondage fréquent.

  • La gestion des erreurs doit suivre chaque étape, en particulier socket_connect () , car les problèmes de réseau sont la source d'exceptions les plus courantes.

Scénarios et avantages applicables

Cette approche s'applique à la plupart des demandes de réseau TCP, notamment:

  • Détection du rythme cardiaque de l'interface HTTP;

  • Surveillance de l'état du service intranet;

  • Contrôles de santé inter-nœuds distribués;

  • Équilibrage de charge simple pré-détection.

Son avantage est qu'il atteint simple, a un contrôle clair et ne s'appuie pas sur des extensions supplémentaires. Il convient aux tâches d'automatisation des scripts ou aux services légers.

Résumer

L'utilisation de socket_set_block () avec le mécanisme de délai d'expiration approprié peut rendre PHP plus résilient et tolérant aux pannes lors de la gestion des connexions du réseau. En particulier dans les environnements ayant des exigences de fiabilité élevée, le contrôle rationnel du comportement de blocage et des stratégies de délai d'expiration est une partie indispensable de la construction d'un système hautement disponible. Grâce au code et aux idées ci-dessus, vous pouvez créer un pool de connexion plus complet, un mécanisme de réessayer ou un système de surveillance des services en fonction des besoins réels.