美文网首页PHP开发PHP经验分享程序员
【PHP】Output Control 扩展详细解读

【PHP】Output Control 扩展详细解读

作者: phpworkerman | 来源:发表于2020-06-14 16:59 被阅读0次
    定义

    一个控制 PHP 脚本输出的函数,PHP 输出数据时会先将数据存储在内存中的一块区域,等待缓冲区内存满了或者脚本执行完毕时,再将数据一次性输出,这块临时存储数据的内存就叫缓冲区。

    作用

    缓冲区也叫缓存,作用是为了解决速度不匹配的问题,高速的 CPU 与内存,内存与硬盘,CPU 与 IO 等速度不匹配的问题,而引人缓冲区,比如我们从磁盘里读取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中读取数据,等缓冲区的数据读取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。

    配置项

    output_buffering:设置为 On 时,在所有的脚本中使用输出控制,如果要限制输出缓冲区的最大值,可将该选项设定为指定的最大字节数(例如 output_buffering=4096),关闭可设置 0 或 Off
    output_handler:该选项可将脚本所有的输出,重定向到一个函数。设置的任何处理函数,将自动的处理输出缓冲。
    implicit_flush:默认为 FALSE。如将该选项改为 TRUE,PHP 将使输出层,在每段信息块输出后,自动刷新。

    ob 函数

    ob_start:打开输出控制缓冲
    ob_get_contents:返回输出缓冲区的内容,如果输出缓冲区无效将返回 FALSE 。
    flush:刷新输出缓冲,该函数将当前为止程序的所有输出发送到用户的浏览器。
    ob_flush:输出缓冲区中的内容,操作完成清除缓冲区
    ob_end_flush:输出缓冲区内容并关闭缓冲,成功返回 TRUE,失败返回 FALSE
    [ob_clean](https://www.php.net/manual/zh/function.ob-clean.php

    ):清空输出缓存区,输出缓冲必须已被 ob_start()PHP_OUTPUT_HANDLER_CLEANABLE 标记启动。否则 ob_clean() 不会有效果。

    ob_end_clean:清空缓冲区并关闭输出缓冲,成功返回 TRUE,失败返回 FALSE
    ob_get_clean:获取当前缓冲区内容并删除当前缓冲区,失败返回 FALSE
    ob_get_flush:以字符串的形式获取输出缓冲区内容,并关闭输出缓冲区,失败返回 FALSE
    ob_get_length:返回输出缓冲区内容的长度,失败返回 FALSE
    ob_get_level:返回输出缓冲机制的嵌套级别,失败返回零
    ob_get_status:得到所有输出缓冲区的状态
    ob_gzhandler:在ob_start中使用的用来压缩输出缓冲区中内容的回调函数,如果一个浏览器不支持压缩过的页面,此函数返回 FALSE
    ob_implicit_flush:打开或是关闭刷新缓存区,TRUE 为打开,FALSE 为关闭
    ob_list_handlers:列出所有使用中的输出处理程序
    output_add_rewrite_var:添加URL重写器的值,form 表单以隐藏域添加键值,相对路径以 GET 参数形式拼接,绝对路径无效
    output_reset_rewrite_vars:重设URL重写器的值,恢复因 output_add_rewrite_var 函数改动的值

    应用场景

    1.解决 PHP header 函数会被之前执行的输出无效化的问题,例:

    <?php
    echo 'Hello World';
    header('Location: https://www.baidu.com');
    

    在缓存区没有打开的情况下,header 函数不会被正确执行,会返回一个 Warning 级别错误 "Cannot modify header information - headers already sent by" ,因为缓冲区关闭后,脚本是即时输出的,当输出 echo 语句时,已经给浏览器返回了响应头,这时候 header 函数想再去修改响应头就已经晚了。该方法常用于框架,这使开发者不必再关心修改响应头之前是否已经有输出。
    2.抑制包含脚本中的输出,例

    ob_start();
    //require 'echo.php';
    include 'echo.php';
    ob_end_clean();
    

    3.页面静态化,页面静态化后会把动态渲染的模板生成 HTML 文件,页面内容直到删除或是有效时间到期前不会再改变。当请求流量很大时,所有的客户都会访问 HTML 文件,避免了直接对数据库的查询,加快页面的打开速度,但静态化同时会产生很多文件,对磁盘容量需要关注,避免超载。

    <?php
    header("Content-Type:text/html;charset=utf-8"); //设置编程字符
    $file = 'test.html'; //静态化文件
    $expr = 3600 * 24 * 7; //设置7天有效期
    
    //文件存在并且不是目录
    if(file_exists($file) && !is_dir($file)){
        //获取文件最后修改时间
        $last_edit_time = filectime($file);
    
        //如果超过静态化时间,重新写入
        if(time() > ($last_edit_time + $expr)){
            echo 'Hello World Ob test page';
            $content = ob_get_contents();
            $work_file = fopen($file,'w');
            fwrite($work_file,$content);
            fclose($work_file);
            ob_end_clean();
        }else{
            include $file;
            exit;
        }
    }else{
        //没有文件时创建,并把模板内容写入
        echo 'Hello World Ob test page';
        $content = ob_get_contents();
        $work_file = fopen($file,'w');
        fwrite($work_file,$content);
        fclose($work_file);
        ob_end_clean();
    }
    

    相关文章

      网友评论

        本文标题:【PHP】Output Control 扩展详细解读

        本文链接:https://www.haomeiwen.com/subject/widmtktx.html