データベースにクエリを実行し、mysqli_result で結果を取得すると、メモリ使用量は非常に少なくなります。ただし、クエリ結果のすべての行を連想配列にフェッチすると、メモリ使用量が非常に高くなります。
<?php
require_once("../config.php"); //db connection config
$db = new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_DBASE);
$query ="select * from table_name";
if($r = $db->query($query)){
echo "MEMORY USAGE before : ". memory_get_usage()."<br><br>";
$rows = array();
while($row = $r->fetch_assoc()){
$rows[]= $row;
}
echo "MEMORY USAGE after : ". memory_get_usage()."<br><br>";
//before: 660880
//after: 114655768
// # of records: around 30 thousands
?>
これほど多くの結果を保存するのは非常にメモリを消費することは理にかなっていますが、どうして mysqli_result がこんなに小さいのか不思議に思っています。fetch_assoc が呼び出されるたびに結果が dbase に照会されるわけではありません。それでは、メモリに保存されている結果はどこにありますか。