PHP不直接管理內(nèi)存的,是即存即取的,形式就是通過變量或變量引用來直接指向某塊內(nèi)存,
目前成都創(chuàng)新互聯(lián)已為超過千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計(jì)、尖草坪網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
方法一:通過yield的生成器實(shí)現(xiàn)有限內(nèi)存中的大文件讀取
方法二:使用SPL 庫 提供的 SplFileObject 類
//第一種?
?php
$conn?=?mysql_connect("主機(jī)名","用戶名","密碼");
mysql_select_db("數(shù)據(jù)庫名",$conn);
$sql?=?"select?*?from?user";
$result?=?mysql_query($sql);
$data="";
while($row?=?mysql_fetch_row($result)){
foreach($row?as?$v){
$data?.=$v."|";??????//加個(gè)樹線隔開字段
}
nl2br($data);????//讀完一行回車
}
file_put_contents("abc.txt",$data);
//第二種
?php
$filename?=?"abc.txt";
$res?=?fopen($filename,"r");
while(!feof($res)){
$buffer?=?fgets($res);
$buffer?=?str_replace('?',?'|',?$buffer);?
$array?=?explode('|',?$buffer);?
foreach($array?as?$v){
if(strlen($v)0){
$arr[]?=?$v;
}
}
}
fclose($res);
//組裝數(shù)組插入數(shù)據(jù)庫就可以了
PHP性能優(yōu)化過程中需要獲取PHP內(nèi)存消耗,使用memory_get_usage()函數(shù)可獲取當(dāng)前的內(nèi)存消耗情況,函數(shù)使用簡(jiǎn)單,這里討論一下memory_get_usage()函數(shù)的用法與實(shí)例
三,基礎(chǔ)用法與實(shí)例
1,獲取當(dāng)前的內(nèi)存消耗量
復(fù)制代碼代碼如下:
?php
echo memory_get_usage();
$var = str_repeat("liuhui", 10000);
echo memory_get_usage();
unset($var);
echo memory_get_usage();
?
分別輸出:62328 122504 62416
說明:memory_get_usage()函數(shù)輸出的數(shù)值為bytes單位
2,格式化memory_get_usage()輸出
復(fù)制代碼代碼如下:
?php
function convert($size){
$unit=array('b','kb','mb','gb','tb','pb');
return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}
echo convert(memory_get_usage(true));
?
輸出:256 kb
3,自定義函數(shù)獲取數(shù)組或變量值大小
復(fù)制代碼代碼如下:
?php
function array_size($arr) {
ob_start();
print_r($arr);
$mem = ob_get_contents();
ob_end_clean();
$mem = preg_replace("/\n +/", "", $mem);
$mem = strlen($mem);
return $mem;
}
$memEstimate = array_size($GLOBALS);
?
不幸地告訴你,PHP是直接操作內(nèi)存的,你聲明的一個(gè)變量,新建的對(duì)象,都是放在內(nèi)存里的。。
--------------分割線------------------------
其實(shí),你要的是一個(gè)緩存,每次讀取的時(shí)候,先讀cache,cache里沒有的話,,你預(yù)加載5頁,放到memcached(一個(gè)比較常用的Cache)里;如果有的話,就直接讀cache。
memcached 是高效、快速的分布式內(nèi)存對(duì)象緩存系統(tǒng)。首先 memcached 是以守護(hù)程序方式運(yùn)行于一個(gè)或多個(gè)服務(wù)器中,隨時(shí)接受客戶端的連接操作,客戶端可以由各種語言編寫,目前已知的客戶端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客戶端在與 memcached 服務(wù)建立連接之后,接下來的事情就是存取對(duì)象了,每個(gè)被存取的對(duì)象都有一個(gè)唯一的標(biāo)識(shí)符 key,存取操作均通過這個(gè) key 進(jìn)行,保存