수색…


매개 변수

기능 세부
ob_start () 출력 버퍼를 시작합니다. 이후에 출력 된 모든 출력은 캡처되어 표시되지 않습니다.
ob_get_contents () ob_start() 캡처 한 모든 내용을 반환합니다.
ob_end_clean () 출력 버퍼를 비우고 현재 중첩 수준에서 출력 버퍼를 끕니다.
ob_get_clean () ob_get_contents()ob_end_clean() 모두 트리거합니다.
ob_get_level () 출력 버퍼의 현재 중첩 수준을 반환합니다.
ob_flush () 버퍼를 종료하지 않고 내용 버퍼를 플러시하고 브라우저로 보냅니다.
ob_implicit_flush () 모든 출력 호출 후에 암시 적으로 플러시를 활성화합니다.
ob_end_flush () 내용 버퍼를 비우고 브라우저로 보내고 버퍼를 끝내십시오.

기본 사용 버퍼간에 콘텐츠 가져 오기 및 지우기

출력 버퍼링을 사용하면 텍스트 내용 (텍스트, HTML )을 변수에 저장하고 스크립트 끝 부분에서 브라우저로 보낼 수 있습니다. 기본적으로 php 는 콘텐츠를 해석 할 때 콘텐츠를 보냅니다.

<?php

// Turn on output buffering
ob_start();

// Print some output to the buffer (via php)
print 'Hello ';

// You can also `step out` of PHP
?>
<em>World</em>
<?php
// Return the buffer AND clear it
$content = ob_get_clean();

// Return our buffer and then clear it
# $content = ob_get_contents();
# $did_clear_buffer = ob_end_clean();

print($content);

#> "Hello <em>World</em>"

ob_start()ob_get_clean() 사이에 출력 된 내용은 캡처되어 $content 변수에 저장됩니다.

ob_get_clean() 호출하면 ob_get_contents()ob_end_clean() 모두 트리거됩니다.

중첩 된 출력 버퍼

ob_get_level() 함수를 사용하여 출력 버퍼를 중첩 (nest)하고 레벨을 가져 와서 다른 내용을 제공 할 수 있습니다.

<?php

$i = 1;
$output = null;

while( $i <= 5 ) {
    // Each loop, creates a new output buffering `level`
    ob_start();
    print "Current nest level: ". ob_get_level() . "\n";
    $i++;
}

// We're at level 5 now
print 'Ended up at level: ' . ob_get_level() . PHP_EOL;

// Get clean will `pop` the contents of the top most level (5)
$output .= ob_get_clean();
print $output;

print 'Popped level 5, so we now start from 4' . PHP_EOL;

// We're now at level 4 (we pop'ed off 5 above)

// For each level we went up, come back down and get the buffer
while( $i > 2 ) {
    print "Current nest level: " . ob_get_level() . "\n";
    echo ob_get_clean();
    $i--;
}

출력 :

Current nest level: 1
Current nest level: 2
Current nest level: 3
Current nest level: 4
Current nest level: 5
Ended up at level: 5
Popped level 5, so we now start from 4
Current nest level: 4
Current nest level: 3
Current nest level: 2
Current nest level: 1

나중에 다시 사용하기 위해 출력 버퍼 캡처

이 예제에서, 우리는 어떤 데이터를 담고있는 배열을 가지고있다.

$items_li_html 출력 버퍼를 포착하고 페이지에서 두 번 사용합니다.

<?php

// Start capturing the output
ob_start();

$items = ['Home', 'Blog', 'FAQ', 'Contact'];

foreach($items as $item):

// Note we're about to step "out of PHP land"
?>
  <li><?php echo $item ?></li>
<?php
// Back in PHP land
endforeach;

// $items_lists contains all the HTML captured by the output buffer
$items_li_html = ob_get_clean();
?>

<!-- Menu 1: We can now re-use that (multiple times if required) in our HTML. -->
<ul class="header-nav">
    <?php echo $items_li_html ?>
</ul>

<!-- Menu 2 -->
<ul class="footer-nav">
    <?php echo $items_li_html ?>
</ul>

위의 코드를 output_buffer.php 파일에 저장하고 php output_buffer.php 를 통해 실행하십시오.

출력 버퍼를 사용하여 PHP에서 생성 한 것과 동일한 목록 항목으로 위에 작성한 2 개의 목록 항목을 볼 수 있습니다.

<!-- Menu 1: We can now re-use that (multiple times if required) in our HTML. -->
<ul class="header-nav">
  <li>Home</li>
  <li>Blog</li>
  <li>FAQ</li>
  <li>Contact</li>
</ul>

<!-- Menu 2 -->
<ul class="footer-nav">
  <li>Home</li>
  <li>Blog</li>
  <li>FAQ</li>
  <li>Contact</li>
</ul>

내용 이전에 출력 버퍼 실행

ob_start();

$user_count = 0;
foreach( $users as $user ) {
    if( $user['access'] != 7 ) { continue; }
    ?>
    <li class="users user-<?php echo $user['id']; ?>">
        <a href="<?php echo $user['link']; ?>">
            <?php echo $user['name'] ?>
        </a>
    </li>
<?php
    $user_count++;
}
$users_html = ob_get_clean();

if( !$user_count ) {
    header('Location: /404.php');
    exit();
}
?>
<html>
<head>
    <title>Level 7 user results (<?php echo $user_count; ?>)</title>
</head>

<body>
<h2>We have a total of <?php echo $user_count; ?> users with access level 7</h2>
<ul class="user-list">
    <?php echo $users_html; ?>
</ul>
</body>
</html>

이 예에서는 $users 를 다차원 배열로 가정하고 액세스 수준이 7 인 모든 사용자를 찾기 위해 루프를 반복합니다.

결과가 없으면 오류 페이지로 리디렉션됩니다.

루프의 결과에 따라 header() 리디렉션을 트리거하기 때문에 여기서 출력 버퍼를 사용하고 있습니다.

출력 버퍼를 사용하여 내용을 파일에 저장하여 보고서, 송장 등에 유용합니다.

<?php
ob_start();
?>
    <html>
    <head>
        <title>Example invoice</title>
    </head>
    <body>
    <h1>Invoice #0000</h1>
    <h2>Cost: &pound;15,000</h2>
    ...
    </body>
    </html>
<?php
$html = ob_get_clean();

$handle = fopen('invoices/example-invoice.html', 'w');
fwrite($handle, $html);
fclose($handle);

이 예제는 완전한 문서를 가져 와서 파일에 쓰고, 문서를 브라우저에 출력하지는 않지만, echo $html;

콜백을 통해 버퍼 처리하기

호출 가능을 ob_start() 에 전달하여 출력에 추가 처리를 적용 할 수 있습니다.

<?php
function clearAllWhiteSpace($buffer) {
    return str_replace(array("\n", "\t", ' '), '', $buffer);
}

ob_start('clearAllWhiteSpace');
?>
<h1>Lorem Ipsum</h1>

<p><strong>Pellentesque habitant morbi tristique</strong> senectus et netus et malesuada fames ac turpis egestas. <a href="#">Donec non enim</a> in turpis pulvinar facilisis.</p>

<h2>Header Level 2</h2>

<ol>
   <li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li>
   <li>Aliquam tincidunt mauris eu risus.</li>
</ol>

<?php
/* Output will be flushed and processed when script ends or call
     ob_end_flush();
*/

산출:

<h1>LoremIpsum</h1><p><strong>Pellentesquehabitantmorbitristique</strong>senectusetnetusetmalesuadafamesacturpisegestas.<ahref="#">Donecnonenim</a>inturpispulvinarfacilisis.</p><h2>HeaderLevel2</h2><ol><li>Loremipsumdolorsitamet,consectetueradipiscingelit.</li><li>Aliquamtinciduntmauriseurisus.</li></ol>

클라이언트에 출력 스트림

/**
 * Enables output buffer streaming. Calling this function
 * immediately flushes the buffer to the client, and any
 * subsequent output will be sent directly to the client.
 */
function _stream() {
    ob_implicit_flush(true);
    ob_end_flush();
}

ob_start 사용의 일반적인 사용 및 이유

ob_start 는 페이지에 리다이렉션이있을 때 특히 편리합니다. 예를 들어 다음 코드는 작동하지 않습니다.

Hello!
<?php
  header("Location: somepage.php");
?>

주어진 오류는 headers already sent by <xxx> on line <xxx> 와 같습니다.

이 문제를 해결하려면 페이지 시작 부분에 다음과 같이 작성하십시오.

<?php
  ob_start();
?>

그리고 페이지 끝 부분에 다음과 같은 내용이 있습니다.

<?php
  ob_end_flush();
?>

생성 된 모든 내용을 출력 버퍼에 저장하고 한 번에 표시합니다. 따라서 페이지에서 임의의 리디렉션 호출이 발생하면 모든 데이터가 전송되기 전에 트리거되어 headers already sent 오류가 발생할 가능성을 제거합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow