Parmi les fonctions de fonctionnement du fichier de PHP, fpassthru () est une fonction discrète mais très pratique. Sa fonction principale est de lire un pointeur de fichier ouvert jusqu'à la fin du fichier et de sortir directement le contenu de lecture. Combiné avec le mécanisme du tampon de sortie de PHP, le comportement de fpassthru () peut être affecté, ce qui affecte à son tour l'efficacité et le contrôle logique de la sortie. Cet article introduira l'utilisation de base de fpassthru () et explorera en profondeur la relation entre elle et le tampon de sortie, et comment utiliser cette fonction raisonnablement pour optimiser la stratégie de sortie de PHP.
Le prototype de fonction de fpassthru () est le suivant:
<span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">fpassthru</span></span><span> ( resource </span><span><span class="hljs-variable">$handle</span></span><span> )
</span></span>
Il accepte un pointeur de ressources de fichier valide (généralement renvoyé par fopen () ), commence à lire le fichier à partir de l'emplacement actuel jusqu'à la fin et envoie le contenu directement au tampon de sortie ou au client. Il est généralement utilisé pour envoyer des contenus de fichiers au navigateur tel qu'il est, tels que le téléchargement de fichiers ou la sortie des journaux.
Exemple:
<span><span><span class="hljs-variable">$fp</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">"example.txt"</span></span><span>, </span><span><span class="hljs-string">"r"</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$fp</span></span><span>) {
</span><span><span class="hljs-comment">// Facultatif:Réglez le bon header</span></span><span>
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">"Content-Type: text/plain"</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fpassthru</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
}
</span></span>
Le mécanisme du tampon de sortie de PHP permet aux développeurs de contrôler lorsque la sortie est envoyée au client. Lorsque le tampon n'est pas activé, PHP envoie immédiatement le contenu au navigateur à chaque fois qu'il effectue une opération d'écho , d'impression ou de sortie similaire. Cependant, après avoir démarré le tampon de sortie avec ob_start () , toutes les sorties seront temporairement stockées dans le tampon jusqu'à ce que l'appel à ob_end_flush () , ob_flush () ou le script soit terminé.
Un rôle important du mécanisme tampon de sortie est qu'il permet aux développeurs de modifier le contenu, d'ajouter des informations d'en-tête et même d'annuler une partie de la sortie avant la sortie, contrôlant ainsi plus flexiblement l'affichage du contenu.
fpassthru () lui-même ne contourne pas le tampon de sortie - il écrira toujours des données dans le tampon au lieu de "sauter" le tampon directement au client. C'est-à-dire que si le tampon de sortie est activé, la sortie du contenu par fpassthru () sera également tamponnée.
Cela signifie que lors de l'utilisation de fpassthru () , si la mise en mémoire tampon de sortie est activée (par exemple, ob_start () est utilisée avant la page), vous devez vous assurer de rafraîchir ou d'effacer le tampon aux temps appropriés, sinon l'utilisateur peut ne pas être en mesure de voir la sortie immédiatement, et même déclencher les "en-têtes déjà envoyés" Erreur avant la sortie.
Par exemple:
<span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-variable">$fp</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">"largefile.zip"</span></span><span>, </span><span><span class="hljs-string">"rb"</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$fp</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">"Content-Type: application/zip"</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">"Content-Disposition: attachment; filename=\"download.zip\""</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fpassthru</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">ob_end_flush</span></span><span>(); </span><span><span class="hljs-comment">// Uniquement après l'exécution de ce contenu est envoyé au client</span></span><span>
</span></span>
Si ob_end_flush () n'est pas appelé, le contenu peut être bloqué dans le tampon pendant longtemps, en particulier lors de la sortie de fichiers volumineux, ce qui peut affecter l'expérience utilisateur.
Lorsque vous utilisez fpassthru () efficacement et en toute sécurité, les points suivants doivent être pris en compte:
Si vous avez besoin de produire du contenu à la volée (comme le téléchargement de fichiers volumineux), il est recommandé de désactiver la mise en mémoire tampon ou de rafraîchir manuellement.
Le tampon peut être effacé en utilisant ob_end_clean () pour éviter les conflits.
<span><span><span class="hljs-comment">// Évitez la sortie supplémentaire interférant avec les téléchargements de fichiers</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-title function_ invoke__">ob_get_level</span></span><span>()) {
</span><span><span class="hljs-title function_ invoke__">ob_end_clean</span></span><span>();
}
</span></span>
Lorsque vous utilisez fpassthru () pour sortir des fichiers, assurez-vous de définir des informations d'en-tête telles que le type de contenu et la disposition du contenu avant d'appeler. Parce qu'une fois le contenu de sortie, le réglage de l'en-tête échouera.
Avant d'appeler fpassthru () pour sortir du contenu, assurez-vous qu'aucun autre HTML, espaces, bom ou messages d'erreur n'est sorti. Ces contenus pollueront le flux de sortie et détruiront l'exactitude des scénarios tels que les téléchargements de fichiers.
Bien que FPassthru () soit essentiellement juste une fonction de sortie simple, son efficacité dans la gestion des transferts de fichiers importants et son utilisation avec le mécanisme du tampon de sortie en font un outil valable dans les opérations de fichiers PHP. Comprendre et correctement l'utilisation de la tampon de sortie peut aider les développeurs à créer une logique de sortie plus contrôlable et plus élevée, en particulier dans les scénarios où le contenu de la réponse client doit être contrôlé.
En combinant les besoins réels et en organisant raisonnablement l'ordre d'utilisation du mécanisme de tampon et des fonctions de sortie, les développeurs PHP peuvent contrôler plus flexible le comportement de sortie de l'application, réalisant ainsi une méthode de présentation de contenu plus professionnelle.