복붙노트

PHP에서 ob_start ()의 사용법은 무엇입니까?

PHP

PHP에서 ob_start ()의 사용법은 무엇입니까?

출력 버퍼링에 ob_start ()가 사용되어 헤더가 버퍼링되어 브라우저로 전송되지 않습니까? 나는 여기에 감각이 있니? 그렇지 않다면 우리는 왜 ob_start ()를 사용해야합니까?

해결법

  1. ==============================

    1.ob_start ()는 "일반적으로 출력되는 모든 것을 기억하기 시작하지만 아직 아무 것도하지 않습니다."라고 생각하십시오.

    ob_start ()는 "일반적으로 출력되는 모든 것을 기억하기 시작하지만 아직 아무 것도하지 않습니다."라고 생각하십시오.

    예 :

    ob_start();
    echo("Hello there!"); //would normally get printed to the screen/output to browser
    $output = ob_get_contents();
    ob_end_clean();
    

    ob_start (), ob_end_clean () 또는 ob_flush ()를 사용하여 버퍼를 "켰다"면 기본적으로 버퍼에 저장된 내용을 제공하는 ob_get_contents ()와 같은 두 가지 다른 함수가 있습니다. 저장을 중단하고 저장된 모든 것을 버리거나 저장을 중지하고 동시에 모두 출력합니다.

  2. ==============================

    2.PHP를 많은 HTML로 분해 할 수는 있지만 렌더링하지는 않습니다. 그것은 색상 코딩을 불가능하게하는 문자열로 저장하지 못하게합니다.

    PHP를 많은 HTML로 분해 할 수는 있지만 렌더링하지는 않습니다. 그것은 색상 코딩을 불가능하게하는 문자열로 저장하지 못하게합니다.

    <?php
    ob_start();
    ?>
    <div>
        <span>text</span>
        <a href="#">link</a>
    </div>
    <?php
    $content = ob_get_clean();
    ?>
    

    대신에:

    <?php
    $content = '<div>
        <span>text</span>
        <a href="#">link</a>
    </div>';
    ?>
    
  3. ==============================

    3.여기에서 허용되는 대답은 ob_start ()가 수행하는 작업 (사용 된 이유가 아닌) (질문 된 질문)을 설명합니다.

    여기에서 허용되는 대답은 ob_start ()가 수행하는 작업 (사용 된 이유가 아닌) (질문 된 질문)을 설명합니다.

    ob_start ()는 출력이 기록되는 버퍼를 생성합니다.

    그러나 PHP 내에서 여러 버퍼를 쌓는 것이 가능하다는 언급은 없습니다. ob_get_level ()을 참조하십시오.

    이유에 관해서 ....

  4. ==============================

    4.당신은 거꾸로 가지고 있습니다. ob_start는 헤더를 버퍼링하지 않으며, 내용을 버퍼링합니다. ob_start를 사용하면 컨텐트를 표시 할 준비가 될 때까지 컨텐트를 서버 측 버퍼에 보관할 수 있습니다.

    당신은 거꾸로 가지고 있습니다. ob_start는 헤더를 버퍼링하지 않으며, 내용을 버퍼링합니다. ob_start를 사용하면 컨텐트를 표시 할 준비가 될 때까지 컨텐트를 서버 측 버퍼에 보관할 수 있습니다.

    이것은 일반적으로 페이지가 헤더를 보낼 수 있도록하기 위해 사용됩니다 (즉, 페이지 렌더링의 절반을 리디렉션하기로 결정한 경우).

  5. ==============================

    5.나는 선호한다:

    나는 선호한다:

    ob_start();
    echo("Hello there!");
    $output = ob_get_clean(); //Get current buffer contents and delete current output buffer
    
  6. ==============================

    6.이것은 JD Isaaks의 대답을 더 명확히하는 것입니다 ...

    이것은 JD Isaaks의 대답을 더 명확히하는 것입니다 ...

    자주 접하는 문제는 PHP를 사용하여 여러 다른 PHP 소스에서 HTML을 출력하고 있으며, 그 이유는 무엇이든간에 다양한 방법으로 출력하는 경우가 종종 있습니다.

    때로는 브라우저에 직접 출력하려는 ​​리터럴 html 콘텐츠가 있습니다. 출력이 동적으로 생성되는 다른 경우 (서버 측).

    동적 내용은 항상 문자열이 될 것입니다 (?). 이제이 문자열 화 된 동적 HTML을 임의의 리터럴, 직접 표시 html ...과 결합하여 하나의 의미있는 html 노드 구조로 만들어야합니다.

    이것은 대개 개발자가 모든 다이렉트 - 투 - 디스플레이 컨텐츠를 문자열 (JD Isaak이 논한 바와 같이)로 감싸도록하여 동적 HTML과 함께 적절하게 전달 / 삽입 될 수 있도록합니다. 감싸 주길 바래.

    그러나 ob _ ## 메소드를 사용하면 문자열 둘러싸기를 피할 수 있습니다. 리터럴 내용은 대신 버퍼에 출력됩니다. 그런 다음 간단한 단계로 버퍼의 전체 내용 (모든 리터럴 HTML)을 동적 HTML 문자열에 연결합니다.

    (필자의 예제는 문자 그대로의 html이 버퍼에 출력되는 것을 보여 주며, html-string에 추가된다. 또한 JD Isaaks 예제에서 string-wrapping-of-html을 본다.)

    <?php // parent.php
    
    //---------------------------------
    $lvs_html  = "" ;
    
    $lvs_html .= "<div>html</div>" ;
    $lvs_html .= gf_component_assembler__without_ob( ) ;
    $lvs_html .= "<div>more html</div>" ;
    
    $lvs_html .= "----<br/>" ;
    
    $lvs_html .= "<div>html</div>" ;
    $lvs_html .= gf_component_assembler__with_ob( ) ;
    $lvs_html .= "<div>more html</div>" ;
    
    echo $lvs_html ;    
    //    02 - component contents
    //    html
    //    01 - component header
    //    03 - component footer
    //    more html
    //    ----
    //    html
    //    01 - component header
    //    02 - component contents
    //    03 - component footer
    //    more html 
    
    //---------------------------------
    function gf_component_assembler__without_ob( ) 
      { 
        $lvs_html  = "<div>01 - component header</div>" ; // <table ><tr>" ;
        include( "component_contents.php" ) ;
        $lvs_html .= "<div>03 - component footer</div>" ; // </tr></table>" ;
    
        return $lvs_html ;
      } ;
    
    //---------------------------------
    function gf_component_assembler__with_ob( ) 
      { 
        $lvs_html  = "<div>01 - component header</div>" ; // <table ><tr>" ;
    
            ob_start();
            include( "component_contents.php" ) ;
        $lvs_html .= ob_get_clean();
    
        $lvs_html .= "<div>03 - component footer</div>" ; // </tr></table>" ;
    
        return $lvs_html ;
      } ;
    
    //---------------------------------
    ?>
    
    <!-- component_contents.php -->
      <div>
        02 - component contents
      </div>
    
  7. ==============================

    7.이 함수는 헤더에만 사용되는 것이 아닙니다. 이것으로 많은 재미있는 것을 할 수 있습니다. 예 : 페이지를 여러 섹션으로 나누어 다음과 같이 사용할 수 있습니다.

    이 함수는 헤더에만 사용되는 것이 아닙니다. 이것으로 많은 재미있는 것을 할 수 있습니다. 예 : 페이지를 여러 섹션으로 나누어 다음과 같이 사용할 수 있습니다.

    $someTemplate->selectSection('header');
    echo 'This is the header.';
    
    $someTemplate->selectSection('content');
    echo 'This is some content.';
    

    여기에서 생성 된 출력을 캡처하여 레이아웃의 완전히 다른 두 위치에 추가 할 수 있습니다.

  8. ==============================

    8.아니요, 틀렸지 만 방향이 맞습니다.)

    아니요, 틀렸지 만 방향이 맞습니다.)

    Output-Buffering은 스크립트 출력을 버퍼링합니다. 그것은 에코 나 프린트 후에도 끝이 없습니다. 헤더가있는 것은 이미 전송되지 않은 경우에만 전송할 수 있다는 것입니다. 그러나 HTTP는 헤더가 전송의 첫 번째라고 말합니다. 따라서 요청을 통해 처음으로 무언가를 출력하면 헤더가 전송되고 다른 헤더는 설정할 수 없습니다.

  9. ==============================

    9.다음과 같은 것들은 기존 답변에 언급되어 있지 않습니다 : 버퍼 크기 구성 HTTP 헤더 및 중첩.

    다음과 같은 것들은 기존 답변에 언급되어 있지 않습니다 : 버퍼 크기 구성 HTTP 헤더 및 중첩.

    ob_start의 버퍼 크기 구성 :

    ob_start(null, 4096); // Once the buffer size exceeds 4096 bytes, PHP automatically executes flush, ie. the buffer is emptied and sent out.
    

    위의 코드는 PHP가 4KB와 같은 더 큰 데이터 청크를 전송할 때 서버 성능을 향상시킵니다 (ob_start 호출없이 php는 각 에코를 브라우저에 보냅니다).

    청크 크기 (즉, 간단한 ob_start ())없이 버퍼링을 시작하면 스크립트가 끝날 때 페이지가 한 번 전송됩니다.

    출력 버퍼링은 HTTP 헤더에 영향을 미치지 않으며, 다른 방식으로 처리됩니다. 그러나 버퍼링으로 인해 출력이 보내진 후에도 여전히 버퍼에 있기 때문에 헤더를 보낼 수 있습니다.

    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
    

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

  10. from https://stackoverflow.com/questions/4401949/whats-the-use-of-ob-start-in-php by cc-by-sa and MIT license