출력 버퍼링이란 무엇입니까?


답변:


274

초보자를위한 웹 개발자를위한 출력 버퍼링 :

출력 버퍼링 (기본값)이 없으면 HTML이 스크립트를 통해 PHP가 처리 할 때 HTML로 브라우저로 전송됩니다. 출력 버퍼링을 사용하면 HTML이 변수에 저장되고 스크립트 끝에서 한 조각으로 브라우저에 전송됩니다.

웹 개발자를위한 출력 버퍼링의 장점

  • 출력 버퍼링 만 켜면 PHP가 HTML을 처리 할 때 HTML이 브라우저로 전송되지 않기 때문에 HTML을 다운로드하여 렌더링하는 데 걸리는 시간이 줄어 듭니다.
  • PHP 문자열로 할 수있는 모든 멋진 작업을 이제 HTML 페이지 전체를 하나의 변수로 사용할 수 있습니다.
  • 쿠키를 설정하는 동안 "경고 : 헤더 정보를 수정할 수 없습니다-(출력)에서 이미 보낸 헤더"라는 메시지가 표시되면 출력 버퍼링이 귀하의 답변임을 알게되어 기쁩니다.

6
+1. 다음은 또 다른 유용한 링크입니다. php.net/manual/en/function.ob-start.php- 변수에 저장하려는 값을 에코하는 함수를 처리 할 때도 유용합니다.
Cam

실제로 모든 것이 끝까지 버퍼링됩니까, 아니면 페이지가 너무 긴 경우 페이지가 덩어리로 나옵니까?
zedoo

5
당신이 출력 버퍼링을 시작하는 경우 @zedoo은 ob_start(), 정말 모든 것이 버퍼링된다. 선택적으로 두번째 파라미터가 ob_start(), int $chunk_size설정 한 경우, 상기 버퍼가 동일한 경우, 버퍼의 길이가 발생하거나 크기를 초과하는 출력 호출 후에 플러쉬되게되는이.
도끼.

12
"경고 : 헤더 정보를 수정할 수 없습니다"라는 메시지가 표시되면 출력 버퍼링을 사용하는 것이 원인이 아니라 증상의 수정이므로 먼저 코드를 감사해야합니다. 차례가되기 전에 무엇인가 쓰고 있습니다. 그래서 나는 동의하지 않지만 대답을 낮추기에는 충분하지 않습니다.
Glenn Plas

5
버퍼링 사용의 출현 만 보았으므로 PHP에서 기본적으로 활성화되어 있지 않은 이유는 무엇입니까?
토머스 반데라스

69

출력 버퍼링 은 PHP에서 성능을 향상시키고 몇 가지 트릭을 수행하는 데 사용됩니다.

  • PHP는 모든 출력을 버퍼에 저장하고 한 번에 모든 출력을 출력하여 네트워크 성능을 향상시킬 수 있습니다.

  • 특정 상황에서 버퍼 내용을 브라우저로 다시 보내지 않고도 버퍼 내용에 액세스 할 수 있습니다.

이 예제를 고려하십시오.

<?php
    ob_start( );
    phpinfo( );
    $output = ob_get_clean( );
?>

위의 예제는 출력을 브라우저로 보내지 않고 변수로 출력을 캡처합니다. output_buffering은 기본적으로 해제되어 있습니다.

  • 내용을 보낸 후 헤더를 수정하려는 경우 출력 버퍼링을 사용할 수 있습니다.

이 예제를 고려하십시오.

<?php
    ob_start( );
    echo "Hello World";
    if ( $some_error )
    {
        header( "Location: error.php" );
        exit( 0 );
    }
?>

Ax와 같은 질문 : 나중에 다시 끄지 않고 출력 버퍼링을 시작하지 않고 스크립트가 모든 종류의 문제로 실행됩니까?
Edward Stumperd

1
플러시 메소드 중 하나를 호출하면 버퍼가 플러시됩니다 (예 : ob_flush()또는 ob_end_flush()). 스크립트가 갑자기 또는 다른 방식으로 종료 될 때 버퍼의 내용도 플러시되므로 문제가 없습니다.
살만 A

17

나는 이것이 오래된 질문이라는 것을 알고 있지만 시각적 학습자를 위해 내 대답을 쓰고 싶었습니다. 전세계 웹에서 출력 버퍼링을 설명하는 다이어그램을 찾을 수 없으므로 Windows에서 직접 다이어그램을 만들었습니다 mspaint.exe.

출력 버퍼링이 해제되면 echo즉시 브라우저로 데이터를 보냅니다.

여기에 이미지 설명을 입력하십시오

출력 버퍼링이 켜져 있으면 echo브라우저로 데이터를 보내기 전에 출력 버퍼로 데이터를 보냅니다.

여기에 이미지 설명을 입력하십시오

phpinfo

출력 버퍼링이 켜져 있는지 꺼져 있는지 확인하려면 핵심 부분의 phpinfo를 참조하십시오. output_buffering출력 버퍼링에 온 / 오프 경우 지시자는 당신을 말할 것이다.

여기에 이미지 설명을 입력하십시오 이 경우 output_buffering값은 4096이며 이는 버퍼 크기가 4KB임을 의미합니다. 또한 웹 서버에서 출력 버퍼링이 설정되어 있음을 의미합니다.

php.ini

output_buffering지시문 의 값을 변경하여 켜거나 끄고 버퍼 크기를 변경할 수 있습니다. 에서 찾은 php.ini다음 원하는 설정으로 변경 한 다음 웹 서버를 다시 시작하십시오. php.ini아래 샘플을 찾을 수 있습니다 .

; Output buffering is a mechanism for controlling how much output data
; (excluding headers and cookies) PHP should keep internally before pushing that
; data to the client. If your application's output exceeds this setting, PHP
; will send that data in chunks of roughly the size you specify.
; Turning on this setting and managing its maximum buffer size can yield some
; interesting side-effects depending on your application and web server.
; You may be able to send headers and cookies after you've already sent output
; through print or echo. You also may see performance benefits if your server is
; emitting less packets due to buffered output versus PHP streaming the output
; as it gets it. On production servers, 4096 bytes is a good setting for performance
; reasons.
; Note: Output buffering can also be controlled via Output Buffering Control
;   functions.
; Possible Values:
;   On = Enabled and buffer is unlimited. (Use with caution)
;   Off = Disabled
;   Integer = Enables the buffer and sets its maximum size in bytes.
; Note: This directive is hardcoded to Off for the CLI SAPI
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
; http://php.net/output-buffering
output_buffering = 4096

지시문 output_buffering은 출력 버퍼링과 관련하여 구성 가능한 유일한 지시문 이 아닙니다. http://php.net/manual/en/outcontrol.configuration.php : 다른 설정 가능한 출력 버퍼링 지시문을 찾을 수 있습니다

예 : ob_get_clean ()

아래 echo에서 브라우저로 보내기 전에 를 캡처 하고 조작 하는 방법을 볼 수 있습니다 .

// Turn on output buffering  
ob_start();  

echo 'Hello World';  // save to output buffer

$output = ob_get_clean();  // Get content from the output buffer, and discard the output buffer ...
$output = strtoupper($output); // manipulate the output  

echo $output;  // send to output stream / Browser

// OUTPUT:  
HELLO WORLD

예 : Hackingwithphp.com

예제와 함께 출력 버퍼에 대한 자세한 정보는 여기에서 찾을 수 있습니다.

http://www.hackingwithphp.com/13/0/0/output-buffering


9

출력 제어 기능을 사용하면 스크립트에서 출력이 전송되는시기를 제어 할 수 있습니다. 이는 스크립트가 데이터 출력을 시작한 후 브라우저에 헤더를 보내야하는 경우 여러 가지 상황에서 유용 할 수 있습니다. 출력 제어 함수는 header () 또는 setcookie ()를 사용하여 전송 된 헤더에는 영향을 미치지 않으며 echo ()와 같은 함수 및 PHP 코드 블록 사이의 데이터에만 영향을줍니다.

http://php.net/manual/en/book.outcontrol.php

추가 자료 :

PHP로 출력 버퍼링


4

이름에서 알 수 있듯이 스크립트 출력이 표시되는 방법을 관리하는 데 사용되는 메모리 버퍼.

여기 주제에 대한 아주 좋은 튜토리얼 이 있습니다.


1
ob_start();  // turns on output buffering
$foo->bar();  // all output goes only to buffer
ob_clean();  // delete the contents of the buffer, but remains buffering active
$foo->render(); // output goes to buffer
ob_flush(); // send buffer output
$none = ob_get_contents();  // buffer content is now an empty string
ob_end_clean();  // turn off output buffering

버퍼는 중첩 될 수 있으므로 한 버퍼가 활성화 된 동안 다른 버퍼가 ob_start()새 버퍼를 활성화합니다. 그래서 ob_end_flush()ob_flush() 정말 출력 버퍼를 보내는 것이 아니라, 부모의 버퍼. 부모 버퍼가없는 경우에만 내용이 브라우저 나 터미널로 전송됩니다.

여기에 잘 설명되어 있습니다 : https://phpfashion.com/everything-about-output-buffering-in-php


0

2019 업데이트. 전용 서버 및 SSD 이상 NVM, 3.5GHZ가있는 경우 100ms-150ms 내에 빠른로드 된 웹 사이트를 만들기 위해 버퍼링을 사용해서는 안됩니다.

Becouse 네트워크는 2019 년 성능 서버 (서버, 메모리, 디스크) 및 APC PHP를 켠 상태에서 스크립트를 천천히 처리하는 것보다 느립니다. 사용자 서버.

따라서 150ms 빠른 속도를 원하면 버퍼링이 느려집니다. 추가 수집 버퍼 데이터가 필요하기 때문에 추가 비용이 발생합니다. 10 년 전 서버가 1s 스크립트를 만들 때 유용했습니다.

jpg를 사용하여로드하고 싶다면 자동화하고 충돌 전송을 플러시 할 수 있다면 output_buffering에는 제한이 없으므로주의하십시오.

건배.

당신은 빠른 강을 만들거나 안전하게 타마를 만들 수 있습니다 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.