Dans la programmation réseau PHP, l'utilisation de la fonction SOCKET_ADDRINFO_CONNECT pour la connexion et l'écriture de données avec FWrite est l'une des méthodes de communication réseau courantes. Afin d'améliorer les performances de la transmission des données, il est particulièrement important d'utiliser rationnellement la technologie tampon. Cet article expliquera en détail comment utiliser les tampons dans la fonction socket_addrinfo_connect avec FWrite et résumer les meilleures pratiques connexes.
socket_addrinfo_connect est une fonction qui effectue une connexion à socket basée sur les informations d'adresse et est souvent utilisée pour les connexions TCP. Une fois la connexion réussie, nous écrivons généralement des données sur le flux de socket via FWrite .
FWrite lui-même a un mécanisme tampon. Lors de l'écriture, il écrira d'abord dans le tampon de sortie PHP. Ce n'est que lorsque le tampon est plein ou actualisé manuellement les données seront envoyées à la prise sous-jacente.
L'appel directement FWRITE pour écrire un grand nombre de petits blocs de données générera un grand nombre de petits paquets, entraînant une "fragmentation des paquets", ce qui affectera l'efficacité de la transmission et augmentera la latence et la charge du processeur.
Utilisation d'un tampon peut:
Réduire le nombre de fois que vous appelez FWrite
Fusionner plusieurs-écritures inférieures en un seul écriture supérieure
Réduire les frais généraux d'appel du système
Améliorer l'utilisation du trafic TCP
<?php
$addrinfo = socket_addrinfo_lookup('m66.net', '80', AF_UNSPEC, SOCK_STREAM);
$socket = socket_addrinfo_connect($addrinfo);
if ($socket === false) {
die("Échec de la connexion");
}
?>
Il est recommandé d'écrire toutes les données dans un tampon de mémoire (chaîne ou autre mécanisme de cache), puis l'envoyer avec FWrite en même temps.
<?php
$buffer = '';
// Simuler plusieurs coutures de données
$dataPieces = ['Hello, ', 'this is ', 'a buffered ', 'write example.'];
foreach ($dataPieces as $piece) {
$buffer .= $piece;
}
// Écrire une foissocket
fwrite($socket, $buffer);
?>
Si les données sont très grandes, il est recommandé de définir une taille de tampon fixe pour bloquer les écritures pour empêcher l'augmentation de l'utilisation excessive de la mémoire.
<?php
$bufferSize = 8192; // 8KBTampon
$offset = 0;
$length = strlen($buffer);
while ($offset < $length) {
$chunk = substr($buffer, $offset, $bufferSize);
$written = fwrite($socket, $chunk);
if ($written === false) {
die("Échec de l'écriture");
}
$offset += $written;
}
?>
Furiez les données d'écriture : essayez de fusionner plusieurs écritures inférieures en une seule écriture supérieure pour réduire les appels système.
Utilisez la taille du tampon approprié : ajustez la taille du tampon en fonction de l'environnement réseau et des performances du serveur pour éviter la pression de la mémoire.
Vernir le tampon dans le temps : après avoir écrit, vous pouvez appeler fflush () pour actualiser le tampon pour vous assurer que les données sont envoyées à temps.
Gestion des erreurs : vérifiez la valeur de retour de FWrite pour gérer les échecs d'écriture et les écritures partielles.
Écriture non bloquante combinée à SELECT : Dans les scénarios de demande haute performance, utilisez une prise non bloquante et Stream_Select pour éviter de bloquer et d'attendre et d'améliorer l'efficacité.
Utilisation de connexions persistantes : Évitez la déconnexion fréquente des connexions et réduisez les frais généraux de l'établissement de connexions.
Optimisation de la couche de réseau : Activez TCP_NODELAY ou ajustez la taille du tampon TCP (selon l'environnement PHP et la prise en charge de la prise sous-jacente).