이 기사에서는 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에는 이전 두 에코 단락의 내용이 포함되어 있습니다. 즉, 이 작업 집합을 통해 출력해야 할 내용을 얻습니다. 변수에 저장됩니다. 이렇게 하면 무슨 소용이 있나요? phpinfo() 및 var_dump()와 같은 직접 출력 함수의 내용을 얻을 수 있지만 클라이언트 화면에는 인쇄되지 않습니다. 예:
ob_start(); php_info(); $v = ob_get_contents(); ob_end_clean(); echo $v;
$v의 내용은 php_info()의 내용입니다. 이것이 출력 버퍼 제어의 두 번째 기능입니다.
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() 함수는 버퍼의 상태 정보입니다. 필드에 대한 설명은 공식 문서를 볼 수 있으며 여기에서는 자세히 설명하지 않습니다.
이것은 예시이지만 전역 출력 필터링, 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
최종 출력 결과는 사과 콘텐츠를 오렌지 콘텐츠로 바꾸는 것입니다.
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>
위 코드에서 단서를 발견하셨나요? 맞습니다. 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() 来进行实际的响应。另外,还有一些其他的场景也会用到输出缓冲控制:
最后,再给出输出缓冲控制相关的函数说明,具体内容大家还是要多看官方文档的介绍。
测试代码: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!