本文實(shí)例講述了php中mysql操作buffer用法。分享給大家供大家參考。具體分析如下:
成都創(chuàng)新互聯(lián)公司于2013年成立,先為東鄉(xiāng)等服務(wù)建站,東鄉(xiāng)等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為東鄉(xiāng)企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
php與mysql的連接有三種方式,mysql,mysqli,pdo。不管使用哪種方式進(jìn)行連接,都有使用buffer和不使用buffer的區(qū)別。
什么叫使用buffer和不使用buffer呢?
客戶(hù)端與mysql服務(wù)端進(jìn)行查詢(xún)操作,查詢(xún)操作的時(shí)候如果獲取的數(shù)據(jù)量比較大,那個(gè)這個(gè)查詢(xún)結(jié)果放在哪里呢?
有兩個(gè)地方可以放:客戶(hù)端的緩沖區(qū)和服務(wù)端的緩沖區(qū)。
我們這里說(shuō)的buffer指的是客戶(hù)端的緩沖區(qū),如果查詢(xún)結(jié)果已經(jīng)從服務(wù)端獲取回來(lái)了,放置在了客戶(hù)端的緩沖區(qū),我們就稱(chēng)之為使用buffer。如果還是存放在服務(wù)端的緩沖區(qū)的話(huà),我們就說(shuō)沒(méi)有使用buffer(unbuffer)。
使用buffer和不使用buffer有什么區(qū)別?
主要在內(nèi)存方面,使用buffer會(huì)增加客戶(hù)端的內(nèi)存壓力,當(dāng)返回的數(shù)據(jù)結(jié)果特別大的時(shí)候可能會(huì)占用調(diào)用客戶(hù)端(實(shí)際就是一個(gè)php進(jìn)程)比較大的進(jìn)程。不使用buffer自然對(duì)服務(wù)端(這里說(shuō)的是提供mysql服務(wù)的服務(wù)器)壓力更大。
具體可以參考:PHP查詢(xún)MySQL大量數(shù)據(jù)的內(nèi)存占用分析
php中三種模式是如何設(shè)置是否使用buffer的?
mysql默認(rèn)的query是使用buffer的,而不使用buffer就需要使用mysql_unbuffer_query
mysqli默認(rèn)的query是不使用buffer的,要使用buffer就需要設(shè)置MYSQLI_STORE_RESULT
pdo默認(rèn)的quey是不使用buffer的,要使用buffer就需要設(shè)置MYSQL_ATTR_USE_BUFFERED_QUERY
大致相關(guān)代碼如下:
?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();
后續(xù)
當(dāng)然如果數(shù)據(jù)量非常大的話(huà),大部分人還是會(huì)考慮使用分批次來(lái)提取和處理數(shù)據(jù)。所以實(shí)際上需要我們關(guān)注和使用mysql是使用buffer還是不使用buffer的場(chǎng)景非常少。
希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。
不知閣下需要的是怎樣的緩存?純客戶(hù)端?還是怎樣的,以下可供參考:
一:儲(chǔ)存于客戶(hù)端的信息,頁(yè)面調(diào)用時(shí)無(wú)需從服務(wù)器解析直接使用(常見(jiàn)的即為Cookie,還有HTML5里的localStorage,Application Cache);
二:離線(xiàn)性質(zhì),即用戶(hù)不在線(xiàn)時(shí),也可以正常訪(fǎng)問(wèn)網(wǎng)頁(yè),所訪(fǎng)問(wèn)的數(shù)據(jù)即客戶(hù)端儲(chǔ)存的緩存(HTML5中的應(yīng)用程序緩存,即Application Cache);
三:客戶(hù)端與服務(wù)端共同緩存的,這種方法可使已經(jīng)從數(shù)據(jù)庫(kù)查詢(xún)的數(shù)據(jù)、已通過(guò)程序計(jì)算得到的數(shù)據(jù)存于服務(wù)器,服務(wù)器解析時(shí)直接調(diào)用,無(wú)需再處理得到,大大減輕了服務(wù)器的壓力(常見(jiàn)的即為session,HTML5中為sessionStorage);
四:純服務(wù)端,同三,即將服務(wù)器已經(jīng)處理好的數(shù)據(jù)暫存于服務(wù)器,需要時(shí)直接調(diào)用而無(wú)需再次處理以便提高效率和減輕服務(wù)器壓力(服務(wù)器端的緩存機(jī)制非常多,網(wǎng)站開(kāi)發(fā)者基本都會(huì));
ob_get_contents, ob_end_clean從實(shí)現(xiàn)上應(yīng)該是ob_get_clean的分解步驟。后者因?yàn)閺腸代碼層面的整合,在僅單次執(zhí)行時(shí),速度上應(yīng)該有微量的優(yōu)勢(shì)。因?yàn)閮?yōu)勢(shì)遠(yuǎn)比網(wǎng)絡(luò)IO的延遲要小,幾乎可以忽略吧。
echo ob_get_contents應(yīng)該也一般是用于首次生成模板緩存。是內(nèi)存操作。
include用于直接顯示。是文件操作。
顯示模板可以用后者,做緩存所節(jié)約的時(shí)間主要是處理計(jì)算和各媒介之間的IO上的,根據(jù)自己的應(yīng)用和自己的設(shè)備環(huán)境在慢的、瓶頸部分作出調(diào)整,是靈活的。沒(méi)有定式。
首先你找到php 的配置文件php.ini
1.php.ini中的output_buffering配置
Off: 表示關(guān)閉PHP輸出緩存
On: 打開(kāi)無(wú)限大的輸出緩存
4096: 打開(kāi)大小為4096Byte的輸出緩存
2.php.ini中的implicit_flush配置
On: 表示每次輸出(如echo,print)后自動(dòng)調(diào)用flush()函數(shù)后,直接輸出
Off: 與On相反,每次輸出后不會(huì)調(diào)用flush(),需要等到server buffering滿(mǎn)了才會(huì)輸出,但是我們可以用flush()函數(shù)代替它,不開(kāi)啟也沒(méi)關(guān)系,反而更加靈活
3.ob_flush()函數(shù): 取出PHP buffering中的數(shù)據(jù),放入server buffering
4.flush()函數(shù): 取出Server buffering的數(shù)據(jù),放入browser buffering
5.ob_start()函數(shù):對(duì)于這個(gè)函數(shù)我現(xiàn)在了解的不是很清楚,因?yàn)殚_(kāi)啟后輸出就會(huì)不受ob_flush()控制,即使使用ob_flush()和flush(),數(shù)據(jù)也不能立即輸出在瀏覽器上.現(xiàn)在知道的是,如果output_buffering=Off,即使使用了ob_start(),也是無(wú)法將輸出數(shù)據(jù)緩存的,而如果output_buffering=On的話(huà),即使不用ob_start(),輸出數(shù)據(jù)也可以被PHP緩存,所以覺(jué)得ob_start比較廢,暫時(shí)不管他
然后我們來(lái)看代碼吧(設(shè)置output_buffering=4096,implicit_flush=Off)
最后的打印效果是
每隔一秒輸出一個(gè)
html
body
?php
// ob_start(); //這玩意開(kāi)了就會(huì)不正常,輸出不受ob_flush()控制,不知道到底干嘛用
// echo str_repeat(' ' ,1000); //IE緩存256Bytes
echo str_repeat(' ' ,1000); //Chrome和FF緩存1000Bytes,這里用來(lái)先將瀏覽器緩存用掉,但是很疑惑這一行輸出為什么沒(méi)有被output_buffering存起來(lái),而是直接輸出了
for($i=0;$i5;$i++) {
echo $i.'br /';
ob_flush();
flush();
sleep(1);
}
?
/body
/html
至于你的可以這么寫(xiě)
?php
echo str_repeat(' ' ,1000);
echo 'abr/';
ob_flush();
flush();
sleep(3);
echo 'bbr/';
?
當(dāng)前題目:php拿到緩沖區(qū)的數(shù)據(jù) php拿到緩沖區(qū)的數(shù)據(jù)怎么處理
URL標(biāo)題:http://www.yijiale78.com/article46/hgcdeg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、網(wǎng)站維護(hù)、網(wǎng)站排名、網(wǎng)站收錄、建站公司、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
移動(dòng)網(wǎng)站建設(shè)知識(shí)