Position actuelle: Accueil> Derniers articles> Utilisez socket_set_block avec socket_read pour implémenter la lecture des octets

Utilisez socket_set_block avec socket_read pour implémenter la lecture des octets

gitbox 2025-05-29

Lors de la programmation des réseaux en PHP, les extensions de socket offrent aux développeurs la possibilité de contrôler les connexions réseau en bas. Parmi eux, socket_set_block et socket_read sont des fonctions clés pour implémenter la lecture synchrone. Si votre objectif est de lire les données d'un octet d'octets à douille, comme un analyseur qui implémente un protocole personnalisé ou un mécanisme de traitement des données de streaming, il est particulièrement important de comprendre l'utilisation de ces deux fonctions.

Cet article expliquera en détail comment utiliser la fonction socket_set_block pour définir la prise sur le mode de blocage et coopérer avec socket_read pour traiter progressivement les données reçues d'une manière qui lit un octet à la fois.

Concepts de base des modes de blocage et de non-blocage

Dans la programmation de socket PHP, les prises peuvent être bloquées ou non bloquantes. En mode blocage, lors de l'appel d'une fonction telle que socket_read , si aucune donnée n'est lisible, le programme y "y bloquera jusqu'à l'arrivée des données. Ce modèle convient aux scénarios où les données sont traitées séquentiellement et facilitent la mise en œuvre du mécanisme de lecture par octets.

Pour définir la prise sur le mode de blocage, vous pouvez utiliser la fonction suivante:

 socket_set_block($socket);

Par défaut, les sockets nouvellement créés bloquent, mais pour assurer un comportement cohérent, il est recommandé d'appeler explicitement Socket_Set_Set_Block une fois avant de lire.

Comment utiliser socket_read

Socket_read est une fonction de PHP qui lit les données à partir d'une prise. Le prototype est le suivant:

 socket_read(resource $socket, int $length, int $type = PHP_BINARY_READ): string|false

dans:

  • $ socket est une ressource de socket avec des connexions établies;

  • $ la longueur représente le nombre d'octets à lire;

  • $ type est généralement utilisé avec php_binary_read pour exprimer la lecture de manière sûre binaire.

Si nous voulons lire des octets de données, nous pouvons définir $ la longueur à 1 :

 $byte = socket_read($socket, 1);

En mode blocage, la fonction attendra qu'au moins un octet soit lisible puis reviendra.

Exemple de code pratique: lire les données du serveur distant par octet

Voici un exemple simple qui se connecte à un serveur distant (prendre Gitbox.net comme exemple) et lit ses données de réponse par octet d'octet jusqu'à ce qu'une nouvelle ligne soit rencontrée.

 <?php
$host = 'gitbox.net';
$port = 80;

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

// Connectez-vous à l&#39;hôte distant
if (!socket_connect($socket, $host, $port)) {
    die("socket_connect() échouer: " . socket_strerror(socket_last_error($socket)) . "\n");
}

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

// Envoyer simple HTTP demander
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));

// Lire l&#39;octet de la réponse,Jusqu&#39;à ce qu&#39;un personnage de Newline soit rencontré
$response = '';
while (true) {
    $byte = socket_read($socket, 1);
    if ($byte === false || $byte === '') {
        break;
    }
    $response .= $byte;
    if ($byte === "\n") {
        break;
    }
}

// Sortir la première ligne de réponse en lecture
echo "Réponse à la première ligne:\n" . $response;

// Fermer la connexion
socket_close($socket);
?>

Choses à noter

  1. Impact des performances : la lecture des octets octets apportera plus d'appels système, de sorte que les performances peuvent être affectées lorsque la quantité de données est importante. Si vous voulez simplement lire un certain modèle (comme jusqu'à une nouvelle ligne), vous pouvez d'abord définir une longueur de lecture raisonnable, puis utiliser StrPos () pour trouver la position de Newline, ce qui est plus efficace.

  2. Problème d'encodage des caractères : Socket_read renvoie les données binaires originales, assurez-vous donc de comprendre comment les données sont codées avant le traitement, en particulier lors du traitement des protocoles de texte.

  3. Délai de connexion : En mode blocage, si le serveur ne répond pas pendant longtemps, le programme s'arrêtera sur socket_read . Envisagez de définir le délai de lecture en combinaison avec socket_set_option .

Résumer

Après avoir réglé la prise sur le mode de blocage via socket_set_block , l'utilisation de socket_read pour lire un octet à la fois peut obtenir un contrôle raffiné des données, ce qui convient à la construction de la logique d'analyse en fonction du protocole de caractères. Bien que cette méthode ne soit pas suffisamment efficace dans certains scénarios de haute performance, il s'agit toujours d'une méthode très pratique lorsque le traitement de flux de données stable et contrôlable est requis.

Avec cette technologie, vous pouvez implémenter une logique d'interaction de réseau plus complexe dans PHP, telles que l'analyse de protocole personnalisée, la reconnaissance de commande caractéristique, etc., pour étendre les capacités de PHP dans la communication côté serveur.