• buffer的相关小知识


    php与mysql的连接有三种方式,mysql,mysqli,pdo。不管使用哪种方式进行连接,都有使用buffer和不使用buffer的区别。

    什么叫使用buffer和不使用buffer呢?

    客户端与mysql服务端进行查询操作,查询操作的时候如果获取的数据量比较大,那个这个查询结果放在哪里呢?

    有两个地方可以放:客户端的缓冲区和服务端的缓冲区。

    我们这里说的buffer指的是客户端的缓冲区,如果查询结果已经从服务端获取回来了,放置在了客户端的缓冲区,我们就称之为使用buffer。如果还是存放在服务端的缓冲区的话,我们就说没有使用buffer(unbuffer)。

    使用buffer和不使用buffer有什么区别?

    主要在内存方面,使用buffer会增加客户端的内存压力,当返回的数据结果特别大的时候可能会占用调用客户端(实际就是一个php进程)比较大的进程。不使用buffer自然对服务端(这里说的是提供mysql服务的服务器)压力更大。

    php中三种模式是如何设置是否使用buffer的?

    • mysql默认的query是使用buffer的,而不使用buffer就需要使用mysql_unbuffer_query
    • mysqli默认的query是不使用buffer的,要使用buffer就需要设置mysqli_store_result
    • pdo默认的quey是不使用buffer的,要使用buffer就需要设置mysql_attr_use_buffered_query

    大致相关代码如下:

    <?php
    $dbConfig = array(
        'host' => '10.128.11.101',
        'port' => '3306',
        'user' => 'test',
        'pass' => 'test',
        'db' => 'test',
    );
     
    $sql = 'select * from so_topic_app';
     
    //---------mysql----------//
    $db = mysql_connect($dbConfig['host'], $dbConfig['user'], $dbConfig['pass']);
    mysql_select_db($dbConfig['db'], $db);
    mysql_set_charset('utf8', $db);
     
     
    // mysql使用buffer
    $res = mysql_query($sql, $db);
     
    $data = array();
    while($row = mysql_fetch_row($res)) {
        $data[] = $row;
    }
     
     
    // mysql不使用buffer
    $res = mysql_unbuffered_query($sql, $db);
     
    $data = array();
    while($row = mysql_fetch_row($res)) {
        $data[] = $row;
    }
     
     
    mysql_close($db);
     
     
    //---------mysqli----------//
    $db = mysqli_connect($dbConfig['host'], $dbConfig['user'], $dbConfig['pass'], $dbConfig['db']);
     
    // mysqli不使用buffer
    $result = mysqli_query($db, $sql);
     
    $data = array();
    while($row = $result->fetch_array()) {
        $data[] = $row;
    }
     
    // mysqli使用buffer
    $result = mysqli_query($db, $sql, MYSQLI_STORE_RESULT);
     
    $data = array();
    while($row = $result->fetch_array()) {
        $data[] = $row;
    }
     
    mysqli_free_result($result);
    mysqli_close($db);
     
     
    //---------pdo----------//
    $dsn = "mysql:dbname={$dbConfig['db']};host={$dbConfig['host']}";
    $pdo = new PDO($dsn, $dbConfig['user'], $dbConfig['pass']);
     
    // pdo不使用buffer
    $stmt = $pdo->prepare($sql);
    $stmt->execute();
    $data = array();
    $data = $stmt->fetchAll();
     
    // pdo使用buffer
    $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
    $stmt = $pdo->prepare($sql);
    $stmt->execute();
    $data = array();
    $data = $stmt->fetchAll();
    ob是output buffering的简称,就是输出缓冲区。如果使用了ob_start函数,那么之后的输出内容(echo等)就不进行实际输出,而是存入缓冲区里面,随
    后可以使用ob_flush实际输出、ob_clean删除、ob_get_contents获得内容保存到静态文件等。
    1、Flush:刷新缓冲区的内容,输出。
    函数格式:flush()
    说明:这个函数经常使用,效率很高。
    2、ob_start :打开输出缓冲区
    函数格式:void ob_start(void)
    说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。
    3 、ob_get_contents :返回内部缓冲区的内容。
    使用方法:string ob_get_contents(void)
    说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE 。
    4、ob_get_length:返回内部缓冲区的长度。
    使用方法:int ob_get_length(void)
    说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激活。则返回 FALSE。
    5、ob_end_flush :发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区。
    使用方法:void ob_end_flush(void)
    说明:这个函数发送输出缓冲区的内容(如果有的话)。
    6、ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区
    使用方法:void ob_end_clean(void)
    说明:这个函数不会输出内部缓冲区的内容而是把它删除!
    7、ob_implicit_flush:打开或关闭绝对刷新
    使用方法:void ob_implicit_flush ([int flag])
    1 <?php  
    2 ob_start();//打开缓冲区域  
    3 phpinfo();//使用phpinfo()函数  
    4 $info=ob_get_flush();//将缓冲区内的数据保存到变量中  
    5 file_put_contents('test.txt', $info);  
    6 ob_end_clean();<span style="font-family:Courier New;">//关闭输出</span>  

     在这里 file_put_contents() 函数把一个字符串写入文件中。

    与依次调用 fopen(),fwrite() 以及 fclose() 功能一样

    file 必需。规定要写入数据的文件。如果文件不存在,则创建一个新文件。
    data 可选。规定要写入文件的数据。可以是字符串、数组或数据流。

     

     
  • 相关阅读:
    学海无涯,回头是岸
    理想很丰满,现实很骨感
    CodeIgniter的工作过程(1)
    如何干净安装OS X El Capitan 全新安装OS X El Capitan方法
    如何让虚拟机通过物理机上安装的代理软件上网
    如何创建可引导的 macOS 安装器
    为什么穿袜子睡觉入睡更快 还能提高睡眠质量?
    Windows下的dll注入(使用CreateRemoteThread)
    Windows下MinGW与MSVC2015关于char指针的区别
    大小端的区分
  • 原文地址:https://www.cnblogs.com/xuzhudong/p/6741471.html
Copyright © 2020-2023  润新知