Position actuelle: Accueil> Derniers articles> Comment les fonctions socket_export_stream et fread lisent-elles les données ensemble? Explication détaillée des exemples pratiques

Comment les fonctions socket_export_stream et fread lisent-elles les données ensemble? Explication détaillée des exemples pratiques

gitbox 2025-08-30

1. Comprendre la fonction socket_export_stream

La fonction de la fonction socket_export_stream est de convertir une ressource de socket brute en une ressource de flux compatible avec les fonctions de flux PHP standard. Il permet à la connexion à socket sous-jacente de travailler avec des fonctions de lecture de flux comme Fread , ce qui rend la lecture des données plus pratique.

 <span><span>resource </span><span><span class="hljs-title function_ invoke__">socket_export_stream</span></span><span> ( resource </span><span><span class="hljs-variable">$socket</span></span><span> )
</span></span>

La valeur de retour est une ressource de flux standard, vous pouvez donc utiliser Fread , FWrite ou d'autres fonctions de fonctionnement de flux pour lire ou écrire des données.

2. Comprendre la fonction Fread

Fread est une fonction utilisée pour lire les données d'un nombre spécifié d'octets à partir d'un pointeur de fichier ou d'un flux. Il est souvent utilisé avec fopen , socket_export_stream , etc., pour lire les données dans le flux.

 <span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-title function_ invoke__">fread</span></span><span> ( resource </span><span><span class="hljs-variable">$handle</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$length</span></span><span> )
</span></span>

paramètre:

  • $ handle est une ressource de flux, qui peut être une ressource de flux renvoyée par socket_export_stream .

  • $ La longueur est le nombre d'octets à lire.

Fread renverra le contenu de lecture, et si les données ne peuvent pas être lues, elle renverra une chaîne vide.

3. Exemple pratique: lecture des données entre le client et le serveur

Nous créerons une instance simple du client TCP communiquant avec le serveur. Le client se connecte au serveur, envoie la demande via la prise et utilise Fread pour lire la réponse du serveur.

3.1 Création du code côté serveur

 <span><span><span class="hljs-comment">// Code côté serveur</span></span><span>
</span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>;

</span><span><span class="hljs-comment">// créer socket ressource</span></span><span>
</span><span><span class="hljs-variable">$server</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-title function_ invoke__">socket_bind</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>, </span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_listen</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Le serveur est démarré,En attente de la connexion du client...\n"</span></span><span>;

</span><span><span class="hljs-comment">// En attente de la connexion du client</span></span><span>
</span><span><span class="hljs-variable">$client</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_accept</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);

</span><span><span class="hljs-comment">// Envoyer des données au client</span></span><span>
</span><span><span class="hljs-variable">$message</span></span><span> = </span><span><span class="hljs-string">"Hello from server!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_write</span></span><span>(</span><span><span class="hljs-variable">$client</span></span><span>, </span><span><span class="hljs-variable">$message</span></span><span>, </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$message</span></span><span>));

</span><span><span class="hljs-comment">// Fermer la connexion</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$client</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);
</span></span>

3.2 Création du code client

 <span><span><span class="hljs-comment">// Code client</span></span><span>
</span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>;

</span><span><span class="hljs-comment">// créer socket ressource</span></span><span>
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-title function_ invoke__">socket_connect</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>);

</span><span><span class="hljs-comment">// Volonté socket ressource转换为流ressource</span></span><span>
</span><span><span class="hljs-variable">$stream</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_export_stream</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);

</span><span><span class="hljs-comment">// Lire les données de Stream</span></span><span>
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);  </span><span><span class="hljs-comment">// Lire le plus 1024 Données d&#39;octets</span></span><span>

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Réponse du serveur: "</span></span><span> . </span><span><span class="hljs-variable">$response</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;

</span><span><span class="hljs-comment">// Fermer la connexion</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>

4. Analyse de code

  • Côté serveur: Tout d'abord, nous avons créé une prise TCP et lié à l'adresse locale et au port 8080. Le serveur écoutera en attendant que le client se connecte. Lorsqu'il y a une connexion client, il accepte la connexion et envoie un message, ferme ensuite la connexion.

  • Client: le client crée d'abord une prise TCP et se connecte au serveur. Ensuite, utilisez socket_export_stream pour convertir la prise en ressource de flux. Ensuite, nous lisons les données renvoyées du serveur via la fonction Fread .

5. Des questions et précautions fréquemment posées

5.1 Les données ne sont pas complètement lues

Dans la programmation réseau, le problème qui est souvent rencontré lors de la lecture des données est une lecture incomplète des données. Par exemple, la quantité de données envoyées par le serveur peut être beaucoup plus grande que le nombre d'octets lus à la fois. Pour le moment, vous devez faire des données d'épissage jusqu'à ce que toutes les données soient lues.

 <span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
</span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>)) {
    </span><span><span class="hljs-variable">$chunk</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);  </span><span><span class="hljs-comment">// Chaque lecture 1024 octet</span></span><span>
    </span><span><span class="hljs-variable">$response</span></span><span> .= </span><span><span class="hljs-variable">$chunk</span></span><span>;
}
</span></span>

5.2 Mode non bloquant

PHP Socket bloque par défaut, c'est-à-dire que Fread peut attendre que les données soient arrivées avant le retour. Si vous avez besoin de lire les données non bloquantes, vous pouvez utiliser socket_set_nonblock pour définir le socket en mode non bloquant, donc Fread reviendra immédiatement, même si les données ne sont pas entièrement lues.

 <span><span><span class="hljs-title function_ invoke__">socket_set_nonblock</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>

6. Résumé

Grâce aux fonctions socket_export_stream et fread , nous pouvons exploiter plus facilement des flux de données de socket. Ces deux fonctions peuvent être utilisées en combinaison pour nous permettre de simplement lire les données réseau à partir d'un serveur distant comme la manipulation d'un flux de fichiers. Dans le développement réel, cette approche est très adaptée à la gestion des interactions de données en temps réel et continues.

Espérons que, à travers les exemples de cet article, vous pouvez mieux comprendre comment combiner ces deux fonctions pour le développement réel et les données de processus obtenues à partir de sockets.