Dans PHP, socket_export_stream () est une fonction très pratique. Il peut convertir une ressource d'extension de socket sous-jacente en flux de flux de niveau supérieur, de sorte que des fonctions de streaming plus abondantes telles que FWrite () , Stream_Socket_Sendto () , Stream_Select () , etc. peuvent être utilisées pour gérer la transmission et la réception des données. Cette transformation est particulièrement utile dans les environnements où les fonctions Stream_ * série sont intégrées, telles que les modèles axés sur l'événement ou le contrôle de contexte de flux.
Cependant, après avoir utilisé socket_export_stream () , de nombreux développeurs ont des questions sur la façon d'envoyer correctement des données en combinaison avec des fonctions telles que Stream_Socket_Sendto () . Cet article analysera ce processus en détail.
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, '0.0.0.0', 12345);
// Volonté socket Transformer les ressources en stream ressource
$stream = socket_export_stream($socket);
Ce flux $ est une ressource PHP Stream qui peut le faire fonctionner comme un fichier. Pour le moment, vous pouvez utiliser la fonction Stream au lieu de la fonction de socket pour le traitement des données.
Stream_Socket_Sendto () est généralement utilisé pour envoyer des données sans protocoles de connexion (tels que UDP). Lorsque vous utilisez des ressources en streaming converties, plusieurs points doivent être prêts à se présenter à:
Le ruisseau doit être désintéressé ou rafraîchi manuellement ( Fflush );
Le format d'adresse doit être dans le format URI standard;
Pour UDP, l'adresse de destination doit être fournie.
$remote = 'udp://m66.net:12345';
$message = "Hello via stream!";
// Avis:stream Doit être écrit,Et l'adresse cible doit être correcte
$bytesSent = stream_socket_sendto($stream, $message, 0, $remote);
if ($bytesSent === false) {
echo "Échec de l'envoi。\n";
} else {
echo "Envoyé avec succès $bytesSent octet。\n";
}
Avec Stream_Select () , vous pouvez surveiller si plusieurs flux (tels que plusieurs ressources converties socket_export_stream) sont lisibles et écrivables en même temps, ce qui est très adapté à la programmation d'E / S non bloquante.
$read = [$stream];
$write = null;
$except = null;
$changed = stream_select($read, $write, $except, 5);
if ($changed > 0) {
$data = fread($stream, 1024);
echo "Données reçues:$data\n";
}
Bien sûr, vous pouvez également utiliser FWRITE () directement sans spécifier explicitement l'adresse cible:
fwrite($stream, "Simple write to stream\n");
Il convient de noter que cette méthode convient aux protocoles axés sur la connexion ou aux prises UDP distantes ont été établies après la liaison.
Après avoir converti la prise d'origine en un flux PHP via socket_export_stream () , vous pouvez facilement utiliser des fonctions avancées telles que stream_socket_sendto () , fwrite () , stream_select (), etc. pour transmettre et recevoir des données, améliorer la maintenabilité et la flexibilité du code. Pendant l'utilisation, vous devez prêter attention au format d'adresse cible, l'état de lecture et d'écriture de la ressource et les caractéristiques du protocole (par exemple si l'UDP est connecté, etc.). Après une configuration appropriée, cette approche est très adaptée à la construction de composants de communication de réseau modernes et hautes performances.