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

출력 버퍼링이란 무엇이며 왜 PHP에서 출력 버퍼링을 사용합니까?



답변

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

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

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

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

답변

출력 버퍼링 은 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 );
    }
?>


답변

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


답변

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

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

추가 자료 :

PHP로 출력 버퍼링


답변

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

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


답변

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


답변

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

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

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

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

건배.

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