ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
当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 下总是为 Off| | output\_handler | NULL | PHP\_INI\_PERDIR | 自 PHP 4.0.4 起可用 |该选项可将脚本所有的输出,重定向到一个函数。例如,将 output\_handler 设置为[mb\_output\_handler()](https://www.php.net/manual/zh/function.mb-output-handler.php)时,字符的编码将被修改为指定的编码。设置的任何处理函数,将自动的处理输出缓冲<br>不能同时使用[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)。<br>只有内置函数可以使用此指令。对于用户定义的函数,使用[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:** ``` //可将缓冲区看做一个容器 ob_start(); // 开启缓冲区 //ob_start()与 ob_get_contents()之间的内容不会直接输出而是会被存储起来,供ob_get_contents和ob_get_clean()输出 echo 1; echo 3; $content = ob_get_contents(); //从缓冲区获取内容 //ob_get_contents与ob_end_clean之间的内容会被忽略 echo 2; ob_end_clean();//清除存储的内容 echo 4; echo $content ; ``` 输出:413 ***** **例2:** ``` ob_start(); //ob_start()与 ob_get_contents()之间的内容会被存储起来,供ob_get_contents和ob_get_clean()输出 echo 'a'; echo 'c'; $content = ob_get_clean(); echo 'b'; echo 'd'; echo $content ; ``` 输出:bdac **例3:** ``` ob_start(); //ob_start()与 ob_get_contents()之间的内容会被存储起来,供ob_get_contents和ob_get_clean()输出 echo 'a'; echo 'c'; ob_start(); echo 1; $content2 = ob_get_clean(); $content = ob_get_clean(); echo 'b'; echo 'd'; echo $content ; echo $content2 ; ``` 输出:bdac1 **例4:** ``` ob_start(); echo 'a'; echo 'c'; ob_start(); echo 1; $content2 = ob_get_contents(); $content = ob_get_clean(); ob_end_clean(); echo 'b'; echo 'd'; echo $content ; echo $content2 ; ``` 输出:bd11 运用场景: 参考模版布局,smarty 1、延迟输出的时候有用 php是按脚本顺序执行的 如果前面输出了内容 ,执行到后面又想对前面已经输出的内容要修改,这时候就有用 如下:将html缓存起来在回调中在修改替换缓存里的内容,然后在返回 ~~~ <?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(); ?> ~~~ 2、比如你的程序需要输出一些内容到浏览器,而在输出的过程中因为某些异常或者错误需要放弃输出,则通过ob缓冲系统可以不把内容输出到浏览器(因为之前输出的内容还是缓冲中,可以随时清掉)。 比如某些函数是直接输出的,而你又想只捕捉这些输出而不让它们传到浏览器,也可以通过ob系统来进行捕捉。 var_dump等输出的内容以字符串的形式返回给浏览器(这个可以修改直接输出的内容) ~~~ ob_start(); var_dmp($data); $result = ob_get_clean(); 具体如:tp5的dump函方法: /** * 浏览器友好的变量输出 * @access public * @param mixed $var 变量 * @param boolean $echo 是否输出(默认为 true,为 false 则返回输出字符串) * @param string|null $label 标签(默认为空) * @param integer $flags htmlspecialchars 的标志 * @return null|string */ public static function dump($var, $echo = true, $label = null, $flags = ENT_SUBSTITUTE) { $label = (null === $label) ? '' : rtrim($label) . ':'; ob_start(); var_dump($var); $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', ob_get_clean()); if (IS_CLI) { $output = PHP_EOL . $label . $output . PHP_EOL; } else { if (!extension_loaded('xdebug')) { $output = htmlspecialchars($output, $flags); } $output = '<pre>' . $label . $output . '</pre>'; } if ($echo) { echo($output); return; } return $output; } ~~~ ## **实时输出到浏览器** 执行时间较长的任务需要在浏览器实时查看执行情况 ``` header("Content-type:text/html;charset=utf-8"); #设置执行时间不限时 set_time_limit(0); #清除并关闭缓冲,输出到浏览器之前使用这个函数。 ob_end_clean(); #控制隐式缓冲泻出,默认off,打开时,对每个 print/echo 或者输出命令的结果都发送到浏览器。 ob_implicit_flush(1); while(1){ //部分浏览器需要内容达到一定长度了才输出 echo str_repeat("<div></div>", 200).'hello sjolzy.cn<br />'; sleep(1); //ob_end_flush(); //ob_flush(); //flush(); } ```