Lorsque vous utilisez la fonction Stream_Bucket_Make_Writable () de PHP, certains développeurs rencontreront une situation où ils renvoient faux , ce qui peut entraîner le fonctionnement du filtre de flux correctement. Cet article analysera en détail pourquoi cette fonction renvoie FALS et fournira des méthodes courantes pour résoudre les problèmes.
Stream_Bucket_Make_Writable () est une fonction sous-jacente dans le système de filtre Stream PHP. Il est souvent utilisé pour écrire des données dans un flux lors de la personnalisation du filtre de flux. Ses fonctions de base sont:
Essayez de récupérer un seau qui peut être écrit à partir de la file d'attente de seaux entrants afin qu'il puisse être modifié puis remis au flux.
La fonction est appelée comme suit:
$bucket = stream_bucket_make_writeable($in);
où $ in est une brigade de godet, représentant la file d'attente de données du filtre actuellement passé.
En cas de succès, la fonction renvoie un objet de godet ; En cas d'échec, faux .
Cette fonction renvoie False signifie généralement qu'il n'y a pas de bloc de données disponible (seau) dans la brigade de seau actuellement passée ( $ in ). Il peut y avoir plusieurs raisons à cela:
Lorsque le flux de données a été transmis, le filtre est toujours appelé, mais pour le moment, $ in n'a pas de seau à lire, donc naturellement stream_bucket_make_writeable () reviendra faux .
Méthode de dépannage:
if (($bucket = stream_bucket_make_writeable($in)) === false) {
// Vérifiez si c'est la fin du flux
error_log("Rien à écrire bucket,Peut-être que le flux est terminé");
}
Si votre filtre est appliqué à un flux sans sortie réelle (comme un fichier sans rédaction de données), il n'y aura pas de seaux passés et la fonction sera renvoyée fausse .
Code testable:
stream_filter_register('example.filter', ExampleFilter::class);
$fp = fopen('php://temp', 'w+');
stream_filter_append($fp, 'example.filter', STREAM_FILTER_WRITE);
fclose($fp); // Aucune donnée écrite
Assurez-vous que votre filtre est correctement appliqué à la direction du flux "écrire" ou "lire". La mauvaise orientation entraînera une défaillance du filtre correctement.
exemple:
// Direction d'écriture correcte
stream_filter_append($fp, 'example.filter', STREAM_FILTER_WRITE);
Si vous n'êtes pas sûr de la direction, il est recommandé d'imprimer le comportement du flux de débogage $ filterams .
Dans la classe de filtre personnalisé, si la logique de traitement est écrite mal, telle que $ en ne pas être traitée correctement ou en retournant de manière incorrecte à l'avance, cela entraînera un stream_bucket_make_writable () pour se comporter anormalement.
Le cadre du filtre de base doit être similaire à ce qui suit:
class ExampleFilter extends php_user_filter {
public function filter($in, $out, &$consumed, $closing) {
while ($bucket = stream_bucket_make_writeable($in)) {
// Modifier ou enregistrer les données
$bucket->data = strtoupper($bucket->data);
$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
}
Assurez-vous que $ godet est géré correctement dans la boucle while et évitez le retour précoce dénué de sens.
Confirmez si $ in est vide : utilisez var_dump ($ in) pour imprimer la structure.
Vérifiez si le flux écrit des données : assurez-vous que le contenu est effectivement transmis via le flux.
Débogage de l'état de fermeture $ du filtre : il est normal que le filtre soit appelé pendant la phase d'arrêt.
Utiliser le comportement de la journalisation : error_log () peut être utilisé pour écrire l'état du seau dans le journal.
Vérifiez la version PHP et la compatibilité : certaines anciennes versions de PHP ont des bogues liés à Stream_Filter . Il est recommandé de tester la reproduction à l'aide d'une version supérieure sur gitbox.net .
Stream_Bucket_Make_Writable () Renvoie False, ce qui est principalement parce que le flux n'a pas de données ou a mis fin à la transmission. Dans les applications pratiques, nous pouvons dépanner et résoudre plus efficacement les problèmes en comprenant correctement sa sémantique, en clarifiant le cycle de vie du filtre et en maîtrisant le calendrier de transmission du flux.
Grâce aux méthodes énumérées dans cet article, vous devriez être en mesure de positionner plus de manière détente la raison derrière le faux rendement et de corriger la logique de mise en œuvre de votre filtre de flux en conséquence.