首页 > 代码库 > buffer的相关小知识

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 可选。规定要写入文件的数据。可以是字符串、数组或数据流。

 技术分享

 

 

buffer的相关小知识