這個(gè)問題在PHP的官方網(wǎng)站上叫緩沖查詢和非緩沖查詢(Buffered and Unbuffered queries)。PHP的查詢?nèi)笔∧J绞蔷彌_模式。也就是說,查詢數(shù)據(jù)結(jié)果會(huì)一次全部提取到內(nèi)存里供PHP程序處理。這樣給了PHP程序額外的功能,比如說,計(jì)算行數(shù),將指針指向某一行等。更重要的是程序可以對(duì)數(shù)據(jù)集反復(fù)進(jìn)行二次查詢和過濾等操作。但這種緩沖查詢模式的缺陷就是消耗內(nèi)存,也就是用空間換速度。
集美ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
相對(duì)的,另外一種PHP查詢模式是非緩沖查詢,數(shù)據(jù)庫服務(wù)器會(huì)一條一條的返回?cái)?shù)據(jù),而不是一次全部返回,這樣的結(jié)果就是PHP程序消耗較少的內(nèi)存,但卻增加了數(shù)據(jù)庫服務(wù)器的壓力,因?yàn)閿?shù)據(jù)庫會(huì)一直等待PHP來取數(shù)據(jù),一直到數(shù)據(jù)全部取完。
很顯然,緩沖查詢模式適用于小數(shù)據(jù)量查詢,而非緩沖查詢適應(yīng)于大數(shù)據(jù)量查詢。
?php
mysql_connect("localhost", "mysql_user", "mysql_password") or
die("Could not connect: " . mysql_error());//連接你的數(shù)據(jù)庫
mysql_select_db("mydb");//選擇你的數(shù)據(jù)庫
$result = mysql_query("SELECT `name` FROM data_boy WHERE `id`='2' LIMIT 0, 60");//執(zhí)行SQL查詢語句,搜索出60條數(shù)據(jù)
while ($row = mysql_fetch_array($result)) {
echo "姓名:".$row[name]."br";
/*補(bǔ)充一句,此處也可以是:
echo "姓名:".$row[0]."br";此處"mysql_fetch_array"默認(rèn)返回的既有 關(guān)聯(lián)數(shù)組(字段作為鍵名),也有數(shù)字索引數(shù)組*/
}
mysql_free_result($result);//釋放結(jié)果
想要知道編寫的 PHP 腳本需要占用多少內(nèi)存么?很簡(jiǎn)單,直接使用 PHP 查看當(dāng)前分配給 PHP 腳本的內(nèi)存的函數(shù) memory_get_usage() 就可以了。
下面是使用示例:
?php
echo memory_get_usage(), 'br /'; // 313864
$tmp = str_repeat('', 4000);
echo memory_get_usage(), 'br /'; // 406048
unset($tmp);
echo memory_get_usage(); // 313952
?
上面的程序后面的注釋代表了它們的輸出(單位為 byte(s)),也就是當(dāng)時(shí) PHP 腳本使用的內(nèi)存(不含 memory_get_usage() 函數(shù)本身占用的內(nèi)存)。
由上面的例子可以看出,要想減少內(nèi)存的占用,可以使用 PHP unset() 函數(shù)把不再需要使用的變量刪除。類似的還有:PHP mysql_free_result() 函數(shù),可以清空不再需要的查詢數(shù)據(jù)庫得到的結(jié)果集,這樣也能得到更多可用內(nèi)存。
PHP memory_get_usage() 函數(shù)還可以有個(gè)參數(shù),$real_usage,其值為布爾值。默認(rèn)為
FALSE,表示得到的內(nèi)存使用量不包括該函數(shù)(PHP 內(nèi)存管理器)占用的內(nèi)存;當(dāng)設(shè)置為 TRUE 時(shí),得到的內(nèi)存為不包括該函數(shù)(PHP
內(nèi)存管理器)占用的內(nèi)存。
所以在實(shí)際編程中,可以用 memory_get_usage() 函數(shù)比較各個(gè)方法占用內(nèi)存的高低,來選擇使用哪種占用內(nèi)存小的方法。
貼個(gè)使用函數(shù):
if (!function_exists('memory_get_usage'))
{
/**
+----------------------------------------------------------
* 取得內(nèi)存使用情況
+----------------------------------------------------------
* @return integer
+----------------------------------------------------------
*/
function memory_get_usage()
{
$pid = getmypid();
if (IS_WIN)
{
exec('tasklist /FI "PID eq ' . $pid . '" /FO LIST', $output);
return preg_replace('/[^0-9]/', '', $output[5]) * 1024;
}
else
{
exec("ps -eo%mem,rss,pid | grep $pid", $output);
$output = explode(" ", $output[0]);
return $output[1] * 1024;
}
}
}
再來個(gè)函數(shù)使用例子:
?php
//memory_get_usage();
$m1 = memory_get_usage();
echo 'br / m1:',$m1;//58096
$a = 'hello';
$b = str_repeat($a,1000);
$m2 = memory_get_usage();
echo 'br / m2:',$m2;//63424
unset($b);
$m3 = memory_get_usage();
echo 'br / m3:',$m3;//58456
?
如何解決PHP向數(shù)據(jù)庫大量插入數(shù)據(jù)時(shí),占用內(nèi)存不斷上升的問題
?php
mysql_connect("localhost", "mysql_user", "mysql_password") or
die("Could not connect: " . mysql_error());//連接你的數(shù)據(jù)庫
mysql_select_db("mydb");//選擇你的數(shù)據(jù)庫
$result = mysql_query("SELECT `name` FROM data_boy WHERE `id`='2' LIMIT 0, 60");//執(zhí)行SQL查詢語句,搜索出60條數(shù)據(jù)
while ($row = mysql_fetch_array($result)) {
echo "姓名:".$row[name]."br";
/*補(bǔ)充一句,此處也可以是:
echo "姓名:".$row[0]."br";此處"mysql_fetch_array"默認(rèn)返回的既有 關(guān)聯(lián)數(shù)組(字段作為鍵名),也有數(shù)字索引數(shù)組*/