PHP8 ob_start — 打开输出控制缓冲

2023-09-12 14:07 更新

(PHP 4, PHP 5, PHP 7, PHP 8)

ob_start — 打开输出控制缓冲

说明

ob_start(callable $callback = null, int $chunk_size = 0, int $flags = PHP_OUTPUT_HANDLER_STDFLAGS): bool

此函数将打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(消息头除外),相反需要输出的内容被存储在内部缓冲区中。

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

警告

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

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

如果脚本结束时输出缓存仍处于激活状态,PHP 会自动输出内容。

参数

callback

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

handler(string $buffer, int $phase = ?): string
buffer
输出缓冲区中的内容。
phase
比特掩码 PHP_OUTPUT_HANDLER_* 常量。

如果 callback 返回 false ,其原来的输入内容被直接送到浏览器。

这个参数 callback 可以通过直接给一个 null 值而避开。

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

注意:

ob_gzhandler() 函数的存在有助于将 gz 编码的数据发送到支持压缩网页的 Web 浏览器。ob_gzhandler() 确定浏览器将接受哪种类型的内容编码并相应的返回输出。

chunk_size

如果可选参数 chunk_size 被赋值了,在任何一个能引起缓冲区的长度等于 或超过 chunk_size 的输出操作后,缓冲区都会被刷送。 默认值 0 意味着函数仅在最后被调用。

flags

flags 参数代表了一个掩码位,用来控制对缓冲区的操作。默认是允许清理、刷新和移除输出缓冲区,可以通过 PHP_OUTPUT_HANDLER_CLEANABLE | PHP_OUTPUT_HANDLER_FLUSHABLE | PHP_OUTPUT_HANDLER_REMOVABLE 显式设置或使用 PHP_OUTPUT_HANDLER_STDFLAGS 作为简写。

每个标志都控制着对一组功能的访问,详细介绍如下:

常量 函数
PHP_OUTPUT_HANDLER_CLEANABLE ob_clean(), ob_end_clean() 和 ob_get_clean()。
PHP_OUTPUT_HANDLER_FLUSHABLE ob_end_flush(), ob_flush() 和 ob_get_flush()。
PHP_OUTPUT_HANDLER_REMOVABLE ob_end_clean(), ob_end_flush() 和 ob_get_flush()。

返回值

成功时返回 true, 或者在失败时返回 false。

示例

示例 #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>

示例 #2 创建不可擦除的输出缓冲区

<?php

ob_start(null, 0, PHP_OUTPUT_HANDLER_STDFLAGS ^ PHP_OUTPUT_HANDLER_REMOVABLE);

?>

参见

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


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号