데이터베이스에 쿼리를 작성하고 mysqli_result에서 결과를 검색하면 메모리 사용량이 매우 적습니다. 그러나 쿼리 결과의 모든 행을 연관 배열로 가져 오면 메모리 사용량이 극도로 높아집니다.PHP : 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에 쿼리 될 수는 없습니다. 그러면 결과는 메모리에 어디에 저장됩니다. 당신이 게시
while($row = $r->fetch_assoc()){
//Do whatever you need with the record, then:
unset($row);
}
방법은 $rows
에 거대한 배열을 수집하고, 메모리 사용량은 반영 :
mysql_ * 함수가 서버에서 모든 결과 행을 한꺼번에 가져 오는 지점을 읽었습니다. 그러나 PDO (및 mysqli)는 필요에 따라 각 행을 검색합니다. 따라서 가져 오기를 요청할 때마다 약간의 메모리를 사용하게됩니다. 그러나 각 행을 배열에 저장하므로 메모리 사용량이 누적 될 수 있습니다. –
fetch를 호출 할 때마다 mysqli가 데이터베이스에 결과를 쿼리한다는 것을 의미합니까? – spchuang
제 생각에'query() '를 호출하면 MySQL은 쿼리를 수행하고 모든 결과 행을 PHP로 반환 할 준비를합니다. 그러나, mysqli가 PDO (적어도 PDO의 기본값)와 같은 경우, fetch를 호출 할 때까지 행 수신을 시작하지 않습니다. 'fetchAll()'을 호출하지 않으면 각 행은 한 번에 하나씩 검색됩니다. 즉, 결과를 배열에 저장했기 때문에 메모리 사용량을 의미합니다. mysqli 때문이 아닙니다. –