PHP 導出數據導致內存溢出

問題描述

當一次獲取大量數據的時候,導致php的內存溢出。
準確的說,是超出了php.ini文件設置的腳本可能消耗的最大內存量。如下圖
在這裏插入圖片描述

解決方法

修改php.ini文件對應的配置項

上圖 memory_limit = 128M 就是 腳本可能消耗的最大內存量,可以適當加大這個值。

代碼中動態修改這個值的大小

另外你可能還要設置腳本的超時時間來配合使用。

set_time_limit(0);//設置腳本執行時間 不超時
ini_set('memory_limit', '512M');

php 的生成器 yield

當修改 memory_limit 的次數越來越頻繁,這個值越來越大。
你開始懷疑,把這個值改成多大都不行,因爲數據量越來越大,內存總有耗盡的時候。
你可能想到減少一次獲取到的數據量,比如在導出數據的時候,可以分批獲取數據。
但是有更簡單的方法。且更重要的是,你不必再擔心腳本內存的耗盡。哪怕你一次獲取全部數據。

代碼如下

如果你自己封裝過一個模型,用來一次獲取結果集中的所有記錄數,下面的代碼你肯定很熟悉。此函數用來獲取結果集中的所有記錄數。

//省略了部分代碼,看你悟性了 ^ ^
function fetchAll($sql){
	//$this->link 保存的是數據庫的連接句柄
	$result=mysqli_query($this->link,$sql);
	$rows = array();
	while($row = mysqli_fetch_array($result,MYSQLI_ASSOC)){
		$rows[]=$row;
	}
	return $rows;
}

只需要簡單修改一下這個函數就能解放你的內存。

//修改後的函數
function fetchAll($sql){
	//$this->link 保存的是數據庫的連接句柄
	$result=mysqli_query($this->link,$sql);
	$num = 0;//用作key
	while($row = mysqli_fetch_array($result,MYSQLI_ASSOC)){
		yield $num => $row;//這裏是關鍵
		$num ++;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章