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 可選。規定要寫入文件的數據。能夠是字符串、數組或數據流。

 

相關文章
相關標籤/搜索