Maison  >  Article  >  développement back-end  >  Explication détaillée du contrôle du tampon de sortie (Output Control) en PHP

Explication détaillée du contrôle du tampon de sortie (Output Control) en PHP

青灯夜游
青灯夜游avant
2021-06-21 18:23:183667parcourir

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.

Explication détaillée du contrôle du tampon de sortie (Output Control) en PHP

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.

Effacer la sortie

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.

Obtenir le contenu du tampon de sortie

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. A cette époque, v. En ce moment, 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.

Actualiser (afficher) le contenu du tampon

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.

Certaines fonctions de détection

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.

Utilisez la fonction de rappel de ob_start() pour remplacer le contenu du tampon de sortie

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.

Ajouter un réécrivain d'URL

output_add_rewrite_var('var', 'value');
// some links
echo &#39;<a href="file.php">link</a>
<a href="http://example.com">link2</a>&#39;;

// <a href="file.php?var=value">link</a>
// <a href="http://example.com">link2</a>

// a form
echo &#39;<form action="script.php" method="post">
<input type="text" name="var2" />
</form>&#39;;

// <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() 来进行实际的响应。另外,还有一些其他的场景也会用到输出缓冲控制:

  • 1.在PHP中,像header(), session_start(), setcookie() 等这样的发送头文件的函数前,不能有任何的输出,而利用输出缓冲控制函数可以在这些函数前进行输出而不报错
  • 2.对输出的内容进行处理,例如生成静态缓存文件、进行gzip压缩输出,这算是较常用的功能了
  • 3.捕获一些不可获取的函数输出,例如phpinfo(), var_dump() 等等,这些函数都会将运算结果显示在浏览器中,而如果我们想对这些结果进行处理,则用输出缓冲控制函数是个不错的方法。说的通俗点,就是这类函数都不会有返回值,而要获取这些函数的输出数据,就要用到输出缓冲控制函数
  • 4.对一些数据进行实时的输出

最后,再给出输出缓冲控制相关的函数说明,具体内容大家还是要多看官方文档的介绍。

  • flush — 刷新输出缓冲
  • ob_clean — 清空(擦掉)输出缓冲区
  • ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲
  • ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲
  • ob_flush — 冲刷出(送出)输出缓冲区中的内容
  • ob_get_clean — 得到当前缓冲区的内容并删除当前输出缓。
  • ob_get_contents — 返回输出缓冲区的内容
  • ob_get_flush — 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。
  • ob_get_length — 返回输出缓冲区内容的长度
  • ob_get_level — 返回输出缓冲机制的嵌套级别
  • ob_get_status — 得到所有输出缓冲区的状态
  • ob_gzhandler — 在ob_start中使用的用来压缩输出缓冲区中内容的回调函数。ob_start callback function to gzip output buffer
  • ob_implicit_flush — 打开/关闭绝对刷送
  • ob_list_handlers — 列出所有使用中的输出处理程序。
  • ob_start — 打开输出控制缓冲
  • output_add_rewrite_var — 添加URL重写器的值(Add URL rewriter values)
  • output_reset_rewrite_vars — 重设URL重写器的值(Reset URL rewriter values)
测试代码:
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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer