2012-07-29 3 views
8

데이터베이스에 쿼리를 작성하고 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에 거대한 배열을 수집하고, 메모리 사용량은 반영 :

+1

mysql_ * 함수가 서버에서 모든 결과 행을 한꺼번에 가져 오는 지점을 읽었습니다. 그러나 PDO (및 mysqli)는 필요에 따라 각 행을 검색합니다. 따라서 가져 오기를 요청할 때마다 약간의 메모리를 사용하게됩니다. 그러나 각 행을 배열에 저장하므로 메모리 사용량이 누적 될 수 있습니다. –

+0

fetch를 호출 할 때마다 mysqli가 데이터베이스에 결과를 쿼리한다는 것을 의미합니까? – spchuang

+1

제 생각에'query() '를 호출하면 MySQL은 쿼리를 수행하고 모든 결과 행을 PHP로 반환 할 준비를합니다. 그러나, mysqli가 PDO (적어도 PDO의 기본값)와 같은 경우, fetch를 호출 할 때까지 행 수신을 시작하지 않습니다. 'fetchAll()'을 호출하지 않으면 각 행은 한 번에 하나씩 검색됩니다. 즉, 결과를 배열에 저장했기 때문에 메모리 사용량을 의미합니다. mysqli 때문이 아닙니다. –

답변

2

결과를 가져 오는 것과 리소스에 대한 포인터를 저장하는 것 사이에 큰 차이가 있습니다.

처음으로 memory_get_usage();을 호출하기 전에 echo $r;을 호출하면 포인터 일뿐입니다. 이것은 결과 세트에 대한 포인터입니다. fetch 결과가 나오기 전까지 결과 집합은 실제로 메모리에 저장되지 않습니다.

당신이하려는 것을 위해 fetchAll()을 실행하는 것이 좋습니다. 그러면 PHP의 루프가 아니라 mysqli 확장 (C 라이브러리)에서 처리되기 때문에 더 나은 성능으로 모든 결과에 액세스하는 1 개의 메소드가 생성됩니다.

자유 결과 기능을 사용하여 메모리에서 결과를 지울 수도 있습니다. 익숙한 경우 Java에서 커서를 닫는 것과 같습니다.

+0

감사합니다. 이것은 매우 도움이됩니다! :) – spchuang

+0

그럼 왜 리소스가 메모리 사용량에 실제로 추가되지 않습니까?리소스가 메모리 공간을 사용하고 있습니다 ... 아니면 디스크에 쓰여 있습니까? –

+0

fetch를 호출하기 전에'$ r'을 echoing하면 MySQL은 쿼리 결과를위한 공간을 할당하지만 PHP는 할당하지 않습니다. PHP는 fetch를 호출 할 때만 메모리 공간에 결과를 할당합니다. –

1

나는이 대신에 당신이해야한다고 생각.

+0

나는 당신이 의미하는 바를 알고 있으며 그것은 fetch_assoc()에 대한 원래의 의도입니다. 문제는 결과를 가져와 무언가를 수행하고 MVC 관점에서 볼 때 레코드를 표시하기 위해 전달한다는 것입니다. 한 번에 하나의 레코드가 전달되도록 구현을 변경할 수 있습니다. – spchuang

+0

그건 현명 할거야 :) – Niloct

+0

고마워. 뷰가 모델과 직접 통신하는 것을 피하려고 노력했기 때문에 문제가되었습니다. 따라서 데이터를 전달할 컨트롤러가 있습니다. 그럼 내가해야 할 일은 각 레코드를 표시하는 아주 작은 뷰 템플릿을 만드는 것입니다 ... – spchuang

관련 문제