buffer的相关小知识

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

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

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

有两个地方能够放:客户端的缓冲区和服务端的缓冲区。数组

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

使用buffer和不使用buffer有什么区别?服务器

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

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

大体相关代码以下:fetch

<?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得到内容保存到静态文件等。
一、Flush:刷新缓冲区的内容,输出。
函数格式:flush()
说明:这个函数常常使用,效率很高。
二、ob_start :打开输出缓冲区
函数格式:void ob_start(void)
说明:当缓冲区激活时,全部来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可使用ob_end_flush()或flush()输出缓冲区的内容。
3 、ob_get_contents :返回内部缓冲区的内容。
使用方法:string ob_get_contents(void)
说明:这个函数会返回当前缓冲区中的内容,若是输出缓冲区没有激活,则返回 FALSE 。
四、ob_get_length:返回内部缓冲区的长度。
使用方法:int ob_get_length(void)
说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents同样,若是输出缓冲区没有激活。则返回 FALSE。
五、ob_end_flush :发送内部缓冲区的内容到浏览器,而且关闭输出缓冲区。
使用方法:void ob_end_flush(void)
说明:这个函数发送输出缓冲区的内容(若是有的话)。
六、ob_end_clean:删除内部缓冲区的内容,而且关闭内部缓冲区
使用方法:void ob_end_clean(void)
说明:这个函数不会输出内部缓冲区的内容而是把它删除!
七、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() 函数把一个字符串写入文件中。spa

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

 

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

 

相关文章
相关标签/搜索