AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
# Output Control扩展(核心) 当PHP脚本有输出时,输出控制函数可以用这些来控制输出。这在多种不同情况中非常有用,尤其是用来在脚本开始输出 数据后,发送http头信息到浏览器。输出控制函数不影响由[header()](https://www.php.net/manual/zh/function.header.php)或[setcookie()](https://www.php.net/manual/zh/function.setcookie.php)发送的文件头信息,仅影响象[echo](https://www.php.net/manual/zh/function.echo.php)这样的函数和PHP代码块间的数据。 > **Note**: > 由于早先的版本的缺陷,当从PHP4.1.x(4.2.x,4.3.x)升级时,必须保证php.ini中的*implicit\_flush*是*OFF*, 否则任何用[ob\_start()](https://www.php.net/manual/zh/function.ob-start.php)的输出将在输出中隐藏掉。 ## 运行时配置 **输出控制配置选项** 名字默认可修改范围更新日志描述output\_buffering"0"PHP\_INI\_PERDIR该选项设置为 On 时,将在所有的脚本中使用输出控制。如果要限制输出缓冲区的最大值,可将该选项设定为指定的最大字节数(例如 output\_buffering=4096)。从PHP 4.3.5 版开始,该选项在 PHP-CLI 下总是为 Offoutput\_handlerNULLPHP\_INI\_PERDIR自 PHP 4.0.4 起可用该选项可将脚本所有的输出,重定向到一个函数。例如,将 output\_handler 设置为[mb\_output\_handler()](https://www.php.net/manual/zh/function.mb-output-handler.php)时,字符的编码将被修改为指定的编码。设置的任何处理函数,将自动的处理输出缓冲 不能同时使用[mb\_output\_handler()](https://www.php.net/manual/zh/function.mb-output-handler.php)和[ob\_iconv\_handler()](https://www.php.net/manual/zh/function.ob-iconv-handler.php),也不能同时使用[ob\_gzhandler()](https://www.php.net/manual/zh/function.ob-gzhandler.php)和[zlib.output\_compression](https://www.php.net/manual/zh/zlib.configuration.php#ini.zlib.output-compression)。 只有内置函数可以使用此指令。对于用户定义的函数,使用[ob\_start()](https://www.php.net/manual/zh/function.ob-start.php)implicit\_flush"0"PHP\_INI\_ALL在 PHP <= 4.2.3 版本中是 PHP\_INI\_PERDIR默认为 **`FALSE`** 。如将该选项改为 **`TRUE`** ,PHP 将使输出层,在每段信息块输出后,自动刷新。这等同于在每次使用[print](https://www.php.net/manual/zh/function.print.php)、[echo](https://www.php.net/manual/zh/function.echo.php)等函数或每个*HTML*块之后,调用 PHP 中的[flush()](https://www.php.net/manual/zh/function.flush.php)函数.不在web环境中使用 PHP 时,打开这个选项对程序执行的性能有严重的影响,通常只推荐在调试时使用。在*CLI SAPI*的执行模式下,该标记默认为 **`TRUE`**函数: ob\_start([\[callback`$output_callback`\[, int`$chunk_size`\[, bool`$erase`\]\]\] ) :bool](https://www.php.net/manual/zh/function.ob-start.php)— 打开输出控制缓冲 [flusht():void](https://www.php.net/manual/zh/function.flush.php)— 刷新输出缓冲 [ob\_flusht():void](https://www.php.net/manual/zh/function.ob-flush.php)— 冲刷出(送出)输出缓冲区中的内容 [ob\_clean():void](https://www.php.net/manual/zh/function.ob-clean.php)— 清空(擦掉)输出缓冲区 [ob\_end\_clean():bool](https://www.php.net/manual/zh/function.ob-end-clean.php)— 清空(擦除)缓冲区并关闭输出缓冲 [ob\_end\_flush():bool](https://www.php.net/manual/zh/function.ob-end-flush.php)— 冲刷出(送出)输出缓冲区内容并关闭缓冲 [ob\_get\_clean():sring](https://www.php.net/manual/zh/function.ob-get-clean.php)— 得到当前缓冲区的内容并删除当前输出缓(图片处理时常用)。 [ob\_get\_contents(void) :string](https://www.php.net/manual/zh/function.ob-get-contents.php)— 返回输出缓冲区的内容 [ob\_get\_flush(void) :string](https://www.php.net/manual/zh/function.ob-get-flush.php)— 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。 [ob\_get\_length(void) :int](https://www.php.net/manual/zh/function.ob-get-length.php)— 返回输出缓冲区内容的长度 [ob\_get\_level(void) :int](https://www.php.net/manual/zh/function.ob-get-level.php)— 返回输出缓冲机制的嵌套级别 [ob\_get\_status(\[bool`$full_status`= FALSE\] ) :array](https://www.php.net/manual/zh/function.ob-get-status.php)— 得到所有输出缓冲区的状态(数组形式返回,默认返回最顶层,参数为true时返回所有) [ob\_gzhandler(string`$buffer`,int`$mode`) :string](https://www.php.net/manual/zh/function.ob-gzhandler.php)— 在ob\_start中使用的用来压缩输出缓冲区中内容的回调函数。ob\_start callback function to gzip output buffer [ob\_implicit\_flush(\[int`$flag`= true\] ) :void](https://www.php.net/manual/zh/function.ob-implicit-flush.php)— 打开/关闭绝对刷送 [ob\_list\_handlers(void) :array](https://www.php.net/manual/zh/function.ob-list-handlers.php)— 列出所有使用中的输出处理程序。 [output\_add\_rewrite\_var](https://www.php.net/manual/zh/function.output-add-rewrite-var.php)— 添加URL重写器的值(Add URL rewriter values) [output\_reset\_rewrite\_vars](https://www.php.net/manual/zh/function.output-reset-rewrite-vars.php)— 重设URL重写器的值(Reset URL rewriter values) 输出缓冲区处理函数的作用有点类似堆栈,临时放入一个存储空间中,对内容进行处理 控制在ob\_start()和ob\_get\_contents()或ob\_start()和ob\_get\_clean()中间内容 **例1:** ``` <pre class="calibre10">``` <span class="token">//可将缓冲区看做一个容器</span> <span class="token4">ob_start</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// 开启缓冲区</span> <span class="token">//ob_start()与 ob_get_contents()之间的内容不会直接输出而是会被存储起来,供ob_get_contents和ob_get_clean()输出</span> echo <span class="token6">1</span><span class="token3">;</span> echo <span class="token6">3</span><span class="token3">;</span> $content <span class="token1">=</span> <span class="token4">ob_get_contents</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//从缓冲区获取内容</span> <span class="token">//ob_get_contents与ob_end_clean之间的内容会被忽略</span> echo <span class="token6">2</span><span class="token3">;</span> <span class="token4">ob_end_clean</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">//清除存储的内容 </span> echo <span class="token6">4</span><span class="token3">;</span> echo $content <span class="token3">;</span> ``` ``` 输出:413 - - - - - - **例2:** ``` <pre class="calibre10">``` <span class="token4">ob_start</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//ob_start()与 ob_get_contents()之间的内容会被存储起来,供ob_get_contents和ob_get_clean()输出</span> echo <span class="token2">'a'</span><span class="token3">;</span> echo <span class="token2">'c'</span><span class="token3">;</span> $content <span class="token1">=</span> <span class="token4">ob_get_clean</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> echo <span class="token2">'b'</span><span class="token3">;</span> echo <span class="token2">'d'</span><span class="token3">;</span> echo $content <span class="token3">;</span> ``` ``` 输出:bdac **例3:** ``` <pre class="calibre10">``` <span class="token4">ob_start</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//ob_start()与 ob_get_contents()之间的内容会被存储起来,供ob_get_contents和ob_get_clean()输出</span> echo <span class="token2">'a'</span><span class="token3">;</span> echo <span class="token2">'c'</span><span class="token3">;</span> <span class="token4">ob_start</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> echo <span class="token6">1</span><span class="token3">;</span> $content2 <span class="token1">=</span> <span class="token4">ob_get_clean</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $content <span class="token1">=</span> <span class="token4">ob_get_clean</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> echo <span class="token2">'b'</span><span class="token3">;</span> echo <span class="token2">'d'</span><span class="token3">;</span> echo $content <span class="token3">;</span> echo $content2 <span class="token3">;</span> ``` ``` 输出:bdac1 **例4:** ``` <pre class="calibre10">``` <span class="token4">ob_start</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> echo <span class="token2">'a'</span><span class="token3">;</span> echo <span class="token2">'c'</span><span class="token3">;</span> <span class="token4">ob_start</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> echo <span class="token6">1</span><span class="token3">;</span> $content2 <span class="token1">=</span> <span class="token4">ob_get_contents</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $content <span class="token1">=</span> <span class="token4">ob_get_clean</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">ob_end_clean</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> echo <span class="token2">'b'</span><span class="token3">;</span> echo <span class="token2">'d'</span><span class="token3">;</span> echo $content <span class="token3">;</span> echo $content2 <span class="token3">;</span> ``` ``` 输出:bd11 运用场景: 参考模版布局,smarty 1、延迟输出的时候有用 php是按脚本顺序执行的 如果前面输出了内容 ,执行到后面又想对前面已经输出的内容要修改,这时候就有用 如下:将html缓存起来在回调中在修改替换缓存里的内容,然后在返回 ``` <pre class="calibre10">``` <span class="token1"><</span><span class="token1">?</span>php <span class="token5">function</span> <span class="token4">callback</span><span class="token3">(</span>$buffer<span class="token3">)</span> <span class="token3">{</span> <span class="token">// replace all the apples with oranges</span> <span class="token5">return</span> <span class="token3">(</span><span class="token4">str_replace</span><span class="token3">(</span><span class="token2">"apples"</span><span class="token3">,</span> <span class="token2">"oranges"</span><span class="token3">,</span> $buffer<span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token4">ob_start</span><span class="token3">(</span><span class="token2">"callback"</span><span class="token3">)</span><span class="token3">;</span> <span class="token1">?</span><span class="token1">></span> <span class="token1"><</span>html<span class="token1">></span> <span class="token1"><</span>body<span class="token1">></span> <span class="token1"><</span>p<span class="token1">></span>It's like comparing apples to oranges<span class="token3">.</span><span class="token1"><</span><span class="token1">/</span>p<span class="token1">></span> <span class="token1"><</span><span class="token1">/</span>body<span class="token1">></span> <span class="token1"><</span><span class="token1">/</span>html<span class="token1">></span> <span class="token1"><</span><span class="token1">?</span>php <span class="token4">ob_end_flush</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token1">?</span><span class="token1">></span> ``` ``` 2、比如你的程序需要输出一些内容到浏览器,而在输出的过程中因为某些异常或者错误需要放弃输出,则通过ob缓冲系统可以不把内容输出到浏览器(因为之前输出的内容还是缓冲中,可以随时清掉)。 比如某些函数是直接输出的,而你又想只捕捉这些输出而不让它们传到浏览器,也可以通过ob系统来进行捕捉。 var\_dump等输出的内容以字符串的形式返回给浏览器(这个可以修改直接输出的内容) ``` <pre class="calibre17">``` <span class="token4">ob_start</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">var_dmp</span><span class="token3">(</span>$data<span class="token3">)</span><span class="token3">;</span> $result <span class="token1">=</span> <span class="token4">ob_get_clean</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> 具体如:tp5的dump函方法: <span class="token">/** * 浏览器友好的变量输出 * @access public * @param mixed $var 变量 * @param boolean $echo 是否输出(默认为 true,为 false 则返回输出字符串) * @param string|null $label 标签(默认为空) * @param integer $flags htmlspecialchars 的标志 * @return null|string */</span> public static <span class="token5">function</span> <span class="token4">dump</span><span class="token3">(</span>$var<span class="token3">,</span> $echo <span class="token1">=</span> <span class="token6">true</span><span class="token3">,</span> $label <span class="token1">=</span> <span class="token5">null</span><span class="token3">,</span> $flags <span class="token1">=</span> ENT_SUBSTITUTE<span class="token3">)</span> <span class="token3">{</span> $label <span class="token1">=</span> <span class="token3">(</span><span class="token5">null</span> <span class="token1">===</span> $label<span class="token3">)</span> <span class="token1">?</span> <span class="token2">''</span> <span class="token3">:</span> <span class="token4">rtrim</span><span class="token3">(</span>$label<span class="token3">)</span> <span class="token3">.</span> <span class="token2">':'</span><span class="token3">;</span> <span class="token4">ob_start</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span>$var<span class="token3">)</span><span class="token3">;</span> $output <span class="token1">=</span> <span class="token4">preg_replace</span><span class="token3">(</span><span class="token2">'/\]\=\>\n(\s+)/m'</span><span class="token3">,</span> <span class="token2">'] => '</span><span class="token3">,</span> <span class="token4">ob_get_clean</span><span class="token3">(</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> <span class="token5">if</span> <span class="token3">(</span>IS_CLI<span class="token3">)</span> <span class="token3">{</span> $output <span class="token1">=</span> PHP_EOL <span class="token3">.</span> $label <span class="token3">.</span> $output <span class="token3">.</span> PHP_EOL<span class="token3">;</span> <span class="token3">}</span> <span class="token5">else</span> <span class="token3">{</span> <span class="token5">if</span> <span class="token3">(</span><span class="token1">!</span><span class="token4">extension_loaded</span><span class="token3">(</span><span class="token2">'xdebug'</span><span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> $output <span class="token1">=</span> <span class="token4">htmlspecialchars</span><span class="token3">(</span>$output<span class="token3">,</span> $flags<span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> $output <span class="token1">=</span> <span class="token2">''</span> <span class="token3">.</span> $label <span class="token3">.</span> $output <span class="token3">.</span> <span class="token2">''</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">if</span> <span class="token3">(</span>$echo<span class="token3">)</span> <span class="token3">{</span> <span class="token4">echo</span><span class="token3">(</span>$output<span class="token3">)</span><span class="token3">;</span> <span class="token5">return</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">return</span> $output<span class="token3">;</span> <span class="token3">}</span> ``` ```