Dans PHP, Stream est une interface unifiée pour le traitement des ressources telles que les fichiers, les réseaux et la mémoire. Le flux d'exploitation efficace est essentiel pour améliorer les performances globales du programme. Cet article se concentrera sur deux fonctions couramment utilisées mais souvent négligées: Stream_get_Filters et Stream_Set_Blocking , et explorer comment optimiser l'efficacité des opérations de flux à travers elles.
La fonction Stream_get_Filters est utilisée pour obtenir la liste actuellement disponible des filtres de flux. Un filtre de flux est un mécanisme pour modifier dynamiquement les données lors de la lecture ou de l'écriture, telles que la compression, le chiffrement ou le codage des données.
Exemple de code:
<?php
$filters = stream_get_filters();
print_r($filters);
?>
La sortie peut être:
Array
(
[0] => string.rot13
[1] => string.toupper
[2] => string.tolower
[3] => convert.iconv.*
[4] => zlib.*
)
En utilisant ces filtres, vous pouvez traiter automatiquement les données pendant la lecture et l'écriture du flux sans avoir à traiter manuellement le code PHP. Cela peut réduire considérablement les frais généraux de traitement du processeur après les opérations d'E / S.
<?php
$fp = fopen('compress.zlib://example.txt.gz', 'w');
fwrite($fp, 'Hello, Gitbox!');
fclose($fp);
?>
Ici, nous utilisons le filtre ZLIB pour compresser directement le fichier, sans écrire d'abord dans le fichier, puis le traiter avec GZCompress .
La fonction Stream_Set_Blocking est utilisée pour changer le mode de blocage ou de non-blocage du flux. Par défaut, le flux bloque, c'est-à-dire que le code PHP attendra que l'opération d'E / S se termine avant la poursuite de l'exécution.
Le mode non bloquant permet au code de continuer à traiter d'autres tâches en attendant les E / S, telles que:
Interroger plusieurs entrées de flux (comme les prises)
Améliorer la réactivité, en particulier dans les scénarios où la latence du réseau est incontrôlable
Exemple de code:
<?php
$fp = fopen('http://gitbox.net/data', 'r');
stream_set_blocking($fp, false);
while (!feof($fp)) {
$data = fread($fp, 1024);
if ($data) {
echo $data;
}
// Autre logique de traitement,Peut être exécuté en attendant les données
usleep(100000); // Délai de traitement de la simulation
}
fclose($fp);
?>
Grâce à un mode non bloquant, le programme peut éviter d'être coincé sur la lecture du réseau pendant longtemps, améliorant considérablement le débit global.
Réduisez le traitement des données manuelles: utilisez des filtres intégrés fournis par Stream_get_Filters au lieu d'un code de compression, de chiffrement ou de formatage manuscrit.
Évitez le blocage et l'attente: les flux de réseau, les pipelines, les prises, etc., utilisez Stream_Set_Blocking avec un sondage d'événements ou un modèle asynchrone pour éviter le ralenti du processeur.
Combiné avec Stream Selector: avec Stream_Select , vous pouvez écouter plusieurs flux en même temps, réduisant encore le temps d'attente.