鍍金池/ 問答/PHP  數(shù)據(jù)庫/ php內(nèi)存問題

php內(nèi)存問題

代碼如下

$num = M('log')->where("date_format(create_time,'%Y-%m') = '$date'")->count('id');

    for($i = 0; ($i+5000)<=20000;$i += 5000){

        $datas = M('credit_log')->where("date_format(create_time,'%Y-%m') = '$date'")->limit($i,$i+5000)->select();
        echo $this->convert(memory_get_usage(true)).'<br/>';
        unset($datas);
        //sleep(5);
    }
    
    

循環(huán)幾次之后,內(nèi)存溢出,為什么會內(nèi)存溢出?因為unset函數(shù)沒有釋放內(nèi)存?

回答
編輯回答
撥弦

limit($i,5000)

2017年6月18日 04:31
編輯回答
蟲児飛

你好,這就要根據(jù)PHP垃圾回收機(jī)制說起了
首先PHP的垃圾收回機(jī)制是引用計數(shù),然后實(shí)現(xiàn)自動清除,當(dāng)你賦值一個變量的時候,PHP并不一定會去直接申請內(nèi)存地址,因為PHP會有一個預(yù)留的地址空間,當(dāng)此空間占滿之后才回去申請,unset之后依據(jù)PHP的垃圾回收機(jī)制不會自動立刻實(shí)現(xiàn)回收,有的unset之后還會保留內(nèi)存空間一段時間,因此得知

2018年3月15日 17:47
編輯回答
茍活

即使你已經(jīng)進(jìn)行變量銷毀了,但是有兩個問題,一,你的內(nèi)存全部釋放了嗎?二,你確定 5000 * 5000 的數(shù)據(jù)量沒有關(guān)系么? limit 的參數(shù),1 是從第幾個開始,后面的參數(shù)是獲取多少條數(shù)據(jù)。

2018年4月21日 01:05