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的?函數
大體相關代碼以下: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 | 可選。規定要寫入文件的數據。能夠是字符串、數組或數據流。 |