Lors du traitement des flux en PHP, nous devons parfois faire fonctionner les données dans le flux plus sous-jacent, tels que la lecture des blocs de données (seaux) pour implémenter la mise en mémoire tampon personnalisée. Le mécanisme de filtre Stream de PHP fournit une interface puissante, où Stream_Bucket_Make_Writable est une fonction clé qui nous permet d'obtenir des blocs de données du tampon du flux, de lire et d'opérer dessus.
Cet article introduira en détail le rôle de Stream_Bucket_Make_Writable , comment lire les blocs de données dans les flux PHP et démontrer son application spécifique à travers un exemple pratique.
Stream_Bucket_Make_Writable est une fonction liée au filtre Stream PHP et appartient à l'interface de fonctionnement de la structure PHP_STREAM_BUCKET . Sa fonction est de «retirer» un bloc de données (seau) du tampon interne du flux et de renvoyer un objet de godet en écriture. Ce seau contient les données actuellement disponibles, que nous pouvons lire ou modifier directement.
Cette fonction est couramment utilisée dans la mise en œuvre de filtres de flux personnalisés, aidant les développeurs à contrôler finement les données en diffusion, telles que la compression, le chiffrement, le décodage et d'autres opérations.
La lecture d'un bloc de données à l'aide de Stream_Bucket_Make_Writable nécessite à peu près les étapes suivantes:
Créer et enregistrer un filtre à flux personnalisé <br> La classe de filtre à flux doit hériter de PHP_USER_FILTER et remplacer la méthode du filtre .
Call stream_bucket_make_writable à l'intérieur de la méthode du filtre
Obtenez un seau via cette fonction pour en lire les données.
Traitement du bloc de données de lecture <br> Vous pouvez lire, modifier ou transmettre des données au filtre suivant.
Retourner le résultat du traitement et terminer l'opération de filtre
L'exemple suivant montre comment définir un filtre de flux personnalisé simple, lire le bloc de données via Stream_Bucket_Make_Writable dans la méthode du filtre et imprimez le contenu:
<?php
class MyReadFilter extends php_user_filter {
public function filter($in, $out, &$consumed, $closing) {
// Boucler tous les blocs de données
while ($bucket = stream_bucket_make_writeable($in)) {
// Lire bucket Données dans
$data = $bucket->data;
// 这里我们简单打印Lire到的数据
echo "Lire数据块内容: " . $data . "\n";
// Nombre d'octets consommés par les marqueurs
$consumed += $bucket->datalen;
// Volonté bucket Passer au filtre ou flux de sortie suivant
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
}
// Enregistrez un filtre personnalisé
stream_filter_register("myreadfilter", "MyReadFilter") or die("Failed to register filter");
// Exemple d'utilisation:从文件流中Lire数据并应用过滤器
$fp = fopen("gitbox.net/sample.txt", "r");
// Joindre un filtre personnalisé au flux
stream_filter_append($fp, "myreadfilter", STREAM_FILTER_READ);
// Lire文件内容,Déclenchera le filtre filter méthode
while (!feof($fp)) {
fread($fp, 8192);
}
fclose($fp);
?>
Stream_Bucket_Make_Writable ($ in) : Sortez un godet de la liste des seaux d'entrée et renvoyez-le. L'objet Backet renvoyé contient les données de propriétés (données de chaîne) et la données (longueur des données).
Après avoir lu les données, vous devez appeler Stream_Bucket_APPEND ($ out, $ Bucket) pour passer le seau à la chaîne de sortie pour assurer l'exécution normale de la chaîne de traitement de flux.
$ consommé est utilisé pour indiquer au filtre de flux combien de blocs de données sont consommés, affectant la gestion des tampons de flux.
La valeur de retour du filtre est généralement utilisée pour utiliser PSFS_PASS_ON pour indiquer une transmission de données normale.
Stream_Bucket_Make_Writable est l'interface centrale pour la lecture des blocs de données de flux dans le mécanisme du filtre de flux PHP, permettant aux développeurs de manipuler directement les données dans le tampon de flux. Grâce à des filtres de flux personnalisés, nous pouvons implémenter une logique complexe de traitement des données, telles que la compression en temps réel, le chiffrement, la surveillance des journaux, etc.
La maîtrise des opérations de blocs de données sous-jacentes des flux peut vous aider à obtenir une plus grande flexibilité et des performances lors du traitement des fichiers volumineux et des données de streaming réseau.
Si vous rencontrez des goulots d'étranglement de performances dans les opérations de flux pendant le développement ou que vous devez effectuer un traitement de données fins dans les flux, il est recommandé d'apprendre et d'appliquer en profondeur Stream_Bucket_Make_Writable et des API de filtre de flux associé.