ホームページ  >  記事  >  バックエンド開発  >  PHPにおける出力バッファ制御(Output Control)の詳細説明

PHPにおける出力バッファ制御(Output Control)の詳細説明

青灯夜游
青灯夜游転載
2021-06-21 18:23:183678ブラウズ

この記事では、PHP の出力バッファー制御 (出力制御) について説明します。一定の参考値があるので、困っている友達が参考になれば幸いです。

PHPにおける出力バッファ制御(Output Control)の詳細説明

PHP では、直接 echo または print_r を実行すると、出力内容が直接印刷されます。ただし、直接印刷したくない場合は、出力バッファー コントロールを使用して出力印刷を制御できます。もちろん、この一連の機能はコンテンツの印刷に限定されず、他の操作も実行できます。これについては最後に説明します。

出力のクリア

まず、echo などによる出力の印刷を許可しない方法を見てみましょう。

ob_start();
echo 111, PHP_EOL;
echo "aaaa", PHP_EOL;
ob_end_clean();

ob_start() 関数は多くの友人が見たことがあると思いますが、その関数は出力バッファ制御の期間を開始することです。 ob_start() 以降のコードの出力ステートメントは出力バッファに入りますが、この時点で ob_end_clean()、ob_clean()、または ob_get_clean() を呼び出しても出力はありません。これら 3 つすべての機能は、出力バッファの内容をクリアすることです。具体的な違いについては、記事の最後にある関数の説明または公式ドキュメントを参照してください。

出力バッファの内容を取得する

ob_start();
echo 111, PHP_EOL;
echo "aaaa", PHP_EOL;
$v = ob_get_contents();
ob_end_clean();

echo $v;

前述したように、ob_end_clean() を使用すると出力バッファの内容がクリアされますが、このコードではob_get_contents() 関数を使用して、バッファの内容を変数 \v に直接割り当てます。現時点では、v.現時点では、

ob_start();
php_info();
$v = ob_get_contents();
ob_end_clean();

echo $v;
$v の内容は php_info() の内容です。これは出力バッファ制御の 2 番目の機能です。

バッファの内容を更新 (出力)

ob_start();
echo 111, PHP_EOL;
echo "aaaa", PHP_EOL;
flush();
ob_flush();

同様に、バッファ内の内容を再度直接出力したい場合は、flush()、ob_flush()、Ob_end_flush を使用します。 () と ob_get_flush() だけで十分であり、実際には、ob_start() の再検証後の echo 出力ステートメントを正常に出力するのと同じです。 さらに、自動更新機能を利用することもできます。

ob_implicit_flush();

ob_start();
echo 111, PHP_EOL;
echo "aaaa", PHP_EOL;

ob_implicit_flush() を使用した後は、バッファーの内容を更新するために ob_flush() などの関数を手動で呼び出す必要がなくなりました。

一部の検出関数

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() は現在のバッファー内のコンテンツの長さを返します。ここでは 123 のみを出力し、3 をバッファーに保存します。文字なので、出力はちょうど 3 になります。 ob_get_level() は、現在のバッファのレベルを返します。上で ob_start() を 2 回呼び出したことに注意してください。これは、バッファのレベルが 2 つあることを意味します。このバッファはネストできます。 ob_get_status() 関数はバッファのステータス情報です。フィールドの説明については、公式ドキュメントを参照してください。ここでは詳しく説明しません。

ob_start() のコールバック関数を使用して出力バッファの内容を置き換える

これは一例ですが、他の関数に拡張することもできます。 、グローバル出力フィルタリング、CSS または JS ファイルの圧縮と最適化などを実行するには、を使用できます。
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
最終的な出力結果は、リンゴのコンテンツをオレンジのコンテンツに置き換えることです。

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>

上記のコードに手がかりはありますか?そうです、output_add_rewrite_var() 関数を使用すると、PHP 出力時に HTML リンクまたはフォーム コードにパラメーターを追加できます。想定している使用シナリオはありますか? POST フォームに対する CSRF 攻撃の防止。 この関数は、php.ini ファイルの url_rewriter.tags 設定項目に従って追加されます。デフォルトでは、この設定項目は from フォームのみをサポートします。同時に、href およびaタグ.hrefのエリアタグ、frameタグのsrc、inputタグのsrcなど。つまり、これらのタグに対応するプロパティにフィールドが自動的に追加されます。もちろん、以前に追加したパラメータをキャンセルするための逆関数output_reset_rewrite_vars()もあります。

总结

关于输出缓冲控制这块还有很多好玩的东西,不过限于篇幅我们先介绍到这里,将来踫到什么好的功能的应用我们再单独讲解。现在基于 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视频教程

以上がPHPにおける出力バッファ制御(Output Control)の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。