Position actuelle: Accueil> Derniers articles> Utilisez socket_set_block pour régler de longues politiques de connexion

Utilisez socket_set_block pour régler de longues politiques de connexion

gitbox 2025-05-28

Dans le développement de PHP, les performances et la vitesse de réponse sont des considérations clés lors de la gestion des connexions longues. L'opération de socket par défaut PHP bloque, ce qui signifie que lorsque le programme appelle une opération de lecture ou d'écriture, il attendra la fin de l'opération, ce qui peut facilement provoquer des goulots d'étranglement des performances lors de la gestion des connexions longues. À cette fin, la fonction SOCKET_SET_BLOCK est utilisée raisonnablement pour ajuster le mode de blocage de la prise, qui peut optimiser efficacement les performances des connexions longues PHP.


Qu'est-ce que Socket_Set_Block?

SOCKET_SET_BLOCK est une fonction en PHP qui définit le mode de blocage de socket. Son but est de maintenir le blocage de la prise. En mode blocage, l'opération de lecture ou d'écriture attendra que les données soient prêtes ou que l'opération soit terminée avant le retour.

 bool socket_set_block ( resource $socket )
  • Paramètre $ socket : la ressource de socket pour définir le mode de blocage.

  • Valeur de retour: renvoie true si réussi, false en cas d'échec.

Correspondant à cela est Socket_Set_NonBlock , qui est utilisé pour définir le mode non bloquant.


Différence entre les modes de blocage et de non-blocage

  • Mode de blocage : lors de l'exécution des opérations de lecture et d'écriture, le programme attend jusqu'à ce que l'opération soit terminée ou chronométrée.

  • Mode non bloquant : lors de l'exécution des opérations de lecture et d'écriture, le programme revient immédiatement et il ne peut y avoir de données.

Dans une longue connexion, si le mode de blocage est utilisé, le programme accrochera en attendant les données, ce qui entraîne l'incapacité de traiter d'autres demandes à temps. Bien que le mode non bloquant puisse améliorer la concurrence, il nécessite un sondage supplémentaire et un jugement de l'État pour augmenter la complexité du code.


Optimiser les performances longues de la connexion avec socket_set_block

La commutation raisonnable entre les modes de blocage et de non-blocage permet à PHP de prendre en compte les performances et la réactivité dans les connexions longues. Les stratégies spécifiques comprennent:

1. Après avoir établi une connexion, utilisez d'abord le mode non bloquant pour attendre les données

Lorsque la connexion vient d'être établie, elle est définie sur le mode non bloquant pour empêcher le programme de suspendre en raison de l'attente des données.

 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, "gitbox.net", 80);
socket_set_nonblock($socket);

2. Lorsqu'il est déterminé que le blocage est nécessaire, passez en mode de blocage

Par exemple, lors de la préparation à lire des données de longueur fixe, utilisez le mode de blocage pour vous assurer que les données sont lues intactes et éviter les problèmes de demi-paquets.

 socket_set_block($socket);
$data = socket_read($socket, 1024);

3. Utilisez Socket_Select pour surveiller l'état du socket

Utilisez Socket_Select pour détecter si la prise a des données à lire et à réduire l'attente non valide.

 $read = [$socket];
$write = $except = null;
if (socket_select($read, $write, $except, 5) > 0) {
    socket_set_block($socket);
    $data = socket_read($socket, 1024);
    // Traitement des données
} else {
    // Traitement de temps mort ou autre logique
}

Exemple de code: optimiser la lecture de la connexion longue à l'aide de socket_set_block

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

$result = socket_connect($socket, "gitbox.net", 80);
if ($result === false) {
    die("socket_connect failed: " . socket_strerror(socket_last_error($socket)));
}

// Définir d&#39;abord le blocage,Éviter le programme coincé
socket_set_nonblock($socket);

// Envoyer une demande
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: keep-alive\r\n\r\n";
socket_write($socket, $request, strlen($request));

// utiliser socket_select Attendez que les données soient lisibles
$read = [$socket];
$write = $except = null;
$timeout_sec = 5;

if (socket_select($read, $write, $except, $timeout_sec) > 0) {
    // Passer en mode de blocage lorsque les données sont prêtes,Assurez-vous que les données complètes sont lues
    socket_set_block($socket);
    $response = '';
    while ($out = socket_read($socket, 2048)) {
        $response .= $out;
        if (strlen($out) < 2048) {
            break;
        }
    }
    echo $response;
} else {
    echo "En attente de temps mort de données ou pas de données";
}

socket_close($socket);
?>

Résumer

  • socket_set_block permet aux opérations de socket de saisir le mode de blocage, adapté à la lecture des données de longueur déterminée et à la garantie de l'intégrité.

  • Faites correspondre raisonnablement le mode non bloquant et Socket_Select pour éviter une attente inutile des programmes dans de longues connexions et améliorer les performances.

  • La clé pour optimiser les performances longues de la connexion est de contrôler le blocage et de bloquer de manière flexible, et de le combiner avec un mécanisme de détection d'événements pour réduire les déchets de ressources.

Grâce aux méthodes ci-dessus, le traitement de la connexion Long PHP sera plus efficace et stable, adapté aux scénarios d'application réseau avec des exigences élevées de performances et de temps de réponse.