# ob_start

(PHP 4, PHP 5, PHP 7)

ob_start — 打开输出控制缓冲

### 说明

ob_start ([ callback `$output_callback` [, int `$chunk_size` [, bool `$erase` ]]] ) : bool

此函数将打开输出缓冲。当输出缓冲激活后，脚本将不会输出内容（除http标头外），相反需要输出的内容被存储在内部缓冲区中。

内部缓冲区的内容可以用 ob_get_contents() 函数复制到一个字符串变量中。 想要输出存储在内部缓冲区中的内容，可以使用 ob_end_flush() 函数。另外， 使用 ob_end_clean() 函数会静默丢弃掉缓冲区的内容。

Warning

当有正在调用的回调函数时，一些网络服务器（例如Apache）会改变一个脚本的工作目录。 你可以在回调函数中再把它改回来，例如 chdir(dirname($_SERVER['SCRIPT_FILENAME'])) 。

输出缓冲区是可堆叠的，这即意谓着，当有一个 ob_start() 是活跃的时， 你可以调用另一个 ob_start() 。 只要确保又正确调用了 ob_end_flush() 恰当的次数即可。 如果有多重输出回调函数是活跃的，输出内容会一直按嵌套的顺序依次通过它们而被过滤。

### 参数

`output_callback`

  可选参数 `output_callback` 函数可以被指定。 此函数把一个字符串当作参数并返回一个字符串。 当输出缓冲区被( ob_flush(), ob_clean() 或者相似的函数)冲刷（送出）或者被清洗的时候；或者在请求结束之际输出缓冲区内容被冲刷到浏览器的时候该函数将会被调用。 当调用 `output_callback` 时，它将收到输出缓冲区的内容作为参数 并预期返回一个新的输出缓冲区作为结果，这个新返回的输出缓冲区内容将被送到浏览器。 如果这个 `output_callback` 不是一个可以调用的函数，此函数 会返回 `FALSE` 。

  如果回调函数有两个参数，第二个参数会由一个位域补充，该位域由 `PHP_OUTPUT_HANDLER_START`, `PHP_OUTPUT_HANDLER_CONT` 和 `PHP_OUTPUT_HANDLER_END` 组成。

  如果 `output_callback` 返回 `FALSE` ，其原来的输入 内容被直接送到浏览器。

  这个参数 `output_callback` 可以通过直接给一个 `NULL` 值而避开。

  ob_end_clean(), ob_end_flush(), ob_clean(), ob_flush() and ob_start() 不能从一个回调函数中调用。 如果从回调函数中调用了它们，产生的行为是不明确的。 如果想要删除缓冲区的内容，从回调函数中返回一个"" (空字符串)。 更不能从一个回调函数中使用像print_r($expression, true) 或highlight_file($filename, true) 一样的输出缓冲函数。

  > Note:

  > 在PHP 4.0.4中， ob_gzhandler() 被引入是为了简化把gz编码过 数据发送到支持压缩网页的浏览器。 ob_gzhandler() 会判定浏览器可以接受哪种类型的编码内容，并返回相应 的输出。

`chunk_size`

  如果可选参数 `chunk_size` 被赋值了，在任何一个能引起缓冲区的长度等于 或超过 `chunk_size` 的输出操作后，缓冲区都会被刷送。 默认值 0 意味着函数仅在最后被调用，其余的特殊值可以将 `chunk_size` 从 1 设定到 4096。

`erase`

  如果可选参数 `erase` 被赋成 `FALSE`，直到脚本执行完成缓冲区才被删除。 这使得，如果调用了冲刷和清洗（清除）函数，会抛出一个“notice”,并返回 `FALSE` 值。

### 返回值

成功时返回 `TRUE`， 或者在失败时返回 `FALSE`。

### 更新日志

版本 | 说明
--- | ---
4.3.2 | 在传递的 `output_callback` 不能被执行时，此函数 被改成返回 `FALSE`
4.2.0 | 添加了 `erase` 参数。

### 范例

Example #1 用户自定义回调函数的例子

    <?php

    function callback($buffer)
    {
      // replace all the apples with oranges
      return (str_replace("apples", "oranges", $buffer));
    }

    ob_start("callback");

    ?>
    <html>
    <body>
    <p>It's like comparing apples to oranges.</p>
    </body>
    </html>
    <?php

    ob_end_flush();

    ?>

以上例程会输出：

    <html>
    <body>
    <p>It's like comparing oranges to oranges.</p>
    </body>
    </html>

### 参见

- ob_get_contents() - 返回输出缓冲区的内容
- ob_end_clean() - 清空（擦除）缓冲区并关闭输出缓冲
- ob_end_flush() - 冲刷出（送出）输出缓冲区内容并关闭缓冲
- ob_implicit_flush() - 打开/关闭绝对刷送
- ob_gzhandler() - 在ob_start中使用的用来压缩输出缓冲区中内容的回调函数。ob_start callback function to gzip output buffer
- ob_iconv_handler() - 以输出缓冲处理程序转换字符编码
- mb_output_handler() - 在输出缓冲中转换字符编码的回调函数
- ob_tidyhandler() - ob_start callback function to repair the buffer