PHP의 출력 버퍼 제어 상세 정보

7341 단어 PHP출력완충제어
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 () 함수는 버퍼의 내용을 변수\v에 직접 부여합니다.이때이때 v에는 앞의 두 단락echo의 내용이 있다. 즉, 이 조작은 우리가 출력해야 할 내용을 얻고 변수에 저장했다.이렇게 하면 무슨 소용이 있습니까?우리는 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();
유사한 것은 버퍼에서 내용을 다시 직접 출력하려면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입니다.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
마지막 출력 결과는 apples 내용을 oranges 내용으로 바꾸는 것입니다.

URL 다시 쓰기 추가


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

// <a href="file.php?var=value" rel="external nofollow" >link</a>
// <a href="http://example.com" rel="external nofollow"  rel="external nofollow" >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,area 탭의href,frame 탭의src,input 탭의src 등도 지원합니다.즉, 이러한 레이블에 해당하는 속성에 필드가 자동으로 추가됩니다.물론 그것도 반함수 output_reset_rewrite_vars () 는 이전에 추가된 이 인자를 취소하는 데 사용됩니다.

총결산


출력 버퍼 제어에 관해서는 아직도 많은 재미있는 것이 있지만, 편폭에 한해서 우리가 먼저 여기에 소개하고, 장래에 s가 어떤 좋은 기능의 응용에 대해 우리가 단독으로 설명한다.현재 Swoole 기반의 응용이 갈수록 많아지고 있습니다. TP, Laravel 같은 전통적인 프레임워크를 Swoole를 지원하는 프레임워크로 전환해야 할 때 입구 파일에서 출력 버퍼 제어를 사용하여 수정해야 합니다.전통적인 프레임워크는 기본적으로 echo와 같은 출력을 직접 진행하기 때문에 Swoole에서 echo와 같은 내용은 콘솔에 직접 인쇄되기 때문에 우리는ob_를 통해get_콘텐츠 () 능력은 모든 출력을 얻어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)
  • 테스트 코드:


    github.com/zhangyue050…
    이상은 PHP의 출력 버퍼 제어에 대한 상세한 내용입니다. PHP 출력 버퍼 제어에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!

    좋은 웹페이지 즐겨찾기