>  기사  >  백엔드 개발  >  PHP의 출력 버퍼 제어(Output Control)에 대한 자세한 설명

PHP의 출력 버퍼 제어(Output Control)에 대한 자세한 설명

青灯夜游
青灯夜游앞으로
2021-06-21 18:23:183678검색

이 기사에서는 PHP의 출력 버퍼 제어(Output Control)를 이해하는 데 도움이 됩니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

PHP의 출력 버퍼 제어(Output Control)에 대한 자세한 설명

PHP에서는 echo나 print_r을 직접 실행하면 출력 내용이 바로 출력됩니다. 그러나 어떤 경우에는 직접 인쇄하고 싶지 않은 경우 출력 버퍼 제어를 사용하여 출력 인쇄를 제어할 수 있습니다. 물론 이 기능 세트는 콘텐츠 인쇄에만 국한되지 않고 다른 작업도 수행할 수 있습니다. 이에 대해서는 마지막에 설명하겠습니다.

출력 지우기

먼저, 출력에 에코 같은 것을 허용하지 않는지 살펴보겠습니다.

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()을 호출하면 출력이 없습니다. 세 가지 모두의 기능은 출력 버퍼의 내용을 지우는 것입니다. 구체적인 차이점은 기사 마지막 부분에 있는 기능 설명이나 공식 문서를 참조하세요.

출력 버퍼의 내용 가져오기

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() 함수를 사용하여 출력 버퍼의 내용을 직접 지웁니다. buffer 내용은 v 변수에 할당됩니다. 이때 v. 이때는 v에는 이전 두 에코 단락의 내용이 포함되어 있습니다. 즉, 이 작업 집합을 통해 출력해야 할 내용을 얻습니다. 변수에 저장됩니다. 이렇게 하면 무슨 소용이 있나요? phpinfo() 및 var_dump()와 같은 직접 출력 함수의 내용을 얻을 수 있지만 클라이언트 화면에는 인쇄되지 않습니다. 예:

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

echo $v;

$v의 내용은 php_info()의 내용입니다. 이것이 출력 버퍼 제어의 두 번째 기능입니다.

Refresh(출력) 버퍼 내용

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

마찬가지로, 내용을 버퍼에 직접 다시 출력하고 싶다면, flash(), 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()를 두 번 호출했는데, 이는 두 가지 수준의 버퍼가 중첩될 수 있음을 의미합니다. 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 형식만 지원하며 동시에 a 태그의 href도 지원할 수 있습니다. 영역 태그의 href, 태그의 src, 입력 태그의 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제