Cet article vous amènera à comprendre le contrôle du tampon de sortie (Output Control) en PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.
En PHP, lorsque nous exécutons directement echo ou print_r, le contenu de sortie sera imprimé directement. Cependant, dans certains cas, nous ne souhaitons pas imprimer directement. Pour le moment, nous pouvons utiliser le contrôle du tampon de sortie pour contrôler l'impression de sortie. Bien entendu, cet ensemble de fonctions ne se limite pas à l’impression de contenu, nous pouvons également effectuer d’autres opérations, dont nous parlerons à la fin.
Tout d'abord, examinons comment ne pas autoriser des éléments comme l'écho à imprimer la sortie.
ob_start(); echo 111, PHP_EOL; echo "aaaa", PHP_EOL; ob_end_clean();
Je pense que beaucoup d'amis auraient dû voir la fonction ob_start(). Sa fonction est de démarrer une période de contrôle du tampon de sortie. Les instructions de sortie dans le code après ob_start() entreront dans le tampon de sortie. À ce moment, si nous appelons ob_end_clean(), ob_clean() ou ob_get_clean(), il n'y aura aucune sortie. La fonction de chacun d’eux est d’effacer le contenu du tampon de sortie. Pour les différences spécifiques, vous pouvez vous référer à la description de la fonction ou à la documentation officielle donnée à la fin de l'article.
ob_start(); echo 111, PHP_EOL; echo "aaaa", PHP_EOL; $v = ob_get_contents(); ob_end_clean(); echo $v;
Comme mentionné ci-dessus, l'utilisation de ob_end_clean() effacera le contenu du tampon de sortie, mais dans ce code, nous utilisons la fonction ob_get_contents() pour affecter directement le contenu du buffer à la variable v avoir les deux premiers Le contenu dans l'écho du segment, c'est-à-dire qu'avec cet ensemble d'opérations, nous obtenons le contenu que nous devons sortir et le sauvegardons dans une variable. A quoi ça sert de faire ça ? Nous pouvons obtenir le contenu des fonctions de sortie directe comme phpinfo() et var_dump(), et elles ne seront pas imprimées sur l'écran client. Par exemple :
ob_start(); php_info(); $v = ob_get_contents(); ob_end_clean(); echo $v;
Le contenu de $v est le contenu de php_info(). Il s'agit de la deuxième capacité de contrôle du tampon de sortie.
ob_start(); echo 111, PHP_EOL; echo "aaaa", PHP_EOL; flush(); ob_flush();
De même, si nous voulons afficher à nouveau directement le contenu dans le tampon, utilisez flush(), ob_flush(), Ob_end_flush() et ob_get_flush() suffisent. En fait, cela équivaut à faire en sorte que les instructions de sortie d'écho soient revalidées et sorties normalement.
De plus, nous pouvons également utiliser une fonction pour actualiser automatiquement.
ob_implicit_flush(); ob_start(); echo 111, PHP_EOL; echo "aaaa", PHP_EOL;
Après avoir utilisé ob_implicit_flush(), nous n'avons plus besoin d'appeler manuellement des fonctions telles que ob_flush() pour actualiser le contenu du tampon.
ob_start(); ob_start(); echo 123, PHP_EOL; echo ob_get_length(), PHP_EOL; // 3 echo ob_get_level(), PHP_EOL; // 2 print_r(ob_get_status(true)); // Array // ( // [0] => Array // ( // [name] => default output handler // [type] => 0 // [flags] => 112 // [level] => 0 // [chunk_size] => 0 // [buffer_size] => 16384 // [buffer_used] => 0 // ) // [1] => Array // ( // [name] => default output handler // [type] => 0 // [flags] => 112 // [level] => 1 // [chunk_size] => 0 // [buffer_size] => 16384 // [buffer_used] => 17 // ) // ) ob_get_flush();
ob_get_length() renverra la longueur du contenu dans le tampon actuel. Ici, nous imprimons uniquement un 123 et enregistrons 3 dans le tampon. caractères, donc la sortie est exactement 3. ob_get_level() renvoie le niveau du tampon actuel. Veuillez noter que nous avons appelé ob_start() deux fois ci-dessus, ce qui signifie qu'il existe deux niveaux de tampons qui peuvent être imbriqués. La fonction ob_get_status() correspond aux informations d'état du tampon. Pour les descriptions des champs, vous pouvez consulter la documentation officielle et n'entrerez pas dans les détails ici.
Ceci est un exemple, mais il peut être étendu à d'autres fonctions Par exemple. , nous pouvons utiliser Pour effectuer un filtrage de sortie global, une compression et une optimisation des fichiers CSS ou JS, etc.
ob_start(function($text){ return (str_replace("apples", "oranges", $text)); }); echo "It's like comparing apples to oranges", PHP_EOL; ob_get_flush(); // It's like comparing oranges to oranges
Le résultat final est de remplacer le contenu des pommes par le contenu des oranges.
output_add_rewrite_var('var', 'value'); // some links echo '<a href="file.php">link</a> <a href="http://example.com">link2</a>'; // <a href="file.php?var=value">link</a> // <a href="http://example.com">link2</a> // a form echo '<form action="script.php" method="post"> <input type="text" name="var2" /> </form>'; // <form action="script.php" method="post"> // <input type="hidden" name="var" value="value" /> // <input type="text" name="var2" /> // </form>
Voyez-vous des indices dans le code ci-dessus ? C'est vrai, en utilisant la fonction output_add_rewrite_var(), nous pouvons ajouter un paramètre au lien HTML ou au code du formulaire lors de la sortie PHP. Avez-vous des scénarios d’utilisation en tête ? Prévention des attaques CSRF sur les formulaires POST.
Cette fonction sera ajoutée en fonction de l'élément de configuration url_rewriter.tags dans le fichier php.ini. Par défaut, cet élément de configuration ne prend en charge que le formulaire from. En même temps, il peut également prendre en charge le href et. balises de zone de la balise a href, src de la balise de cadre, src de la balise d'entrée, etc. Autrement dit, les champs seront automatiquement ajoutés aux propriétés correspondant à ces balises. Bien sûr, il dispose également d'une fonction inverse output_reset_rewrite_vars() pour annuler le paramètre précédemment ajouté.
关于输出缓冲控制这块还有很多好玩的东西,不过限于篇幅我们先介绍到这里,将来踫到什么好的功能的应用我们再单独讲解。现在基于 Swoole 的应用越来越多,当我们需要将 TP 、 Laravel 这类传统框架转换成支持 Swoole 的时候,往往就需要在入口文件使用输出缓冲控制来进行修改。因为传统框架基本都是直接进行 echo 之类的输出的,而在 Swoole 中,echo 这类的内容是直接打印在控制台的,这就需要我们通过 ob_get_contents() 能力获得全部的输出再通过 response->end() 来进行实际的响应。另外,还有一些其他的场景也会用到输出缓冲控制:
最后,再给出输出缓冲控制相关的函数说明,具体内容大家还是要多看官方文档的介绍。
测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/202005/source/%E8%BF%98%E6%90%9E%E4%B8%8D%E6%87%82PHP%E4%B8%AD%E7%9A%84%E8%BE%93%E5%87%BA%E7%BC%93%E5%86%B2%E6%8E%A7%E5%88%B6%EF%BC%9F.php
推荐学习:《PHP视频教程》
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!