2010-03-23 6 views
11

나는 관련된 모든 결과 메모리가 스크립트가 끝날 때 자동으로 해제된다는 것을 알고 있습니다. 하지만 아래와 같이 꽤 비슷한 많은 동작을 사용하고 있다면 사용하는 것이 좋습니다.

$sql = "select * from products"; 
$result = mysql_query($sql); 
if($result && mysql_num_rows($result) > 0) { 
    while($data = mysql_fetch_assoc($result)) { 
    $sql2 = "insert into another_table set product_id = '".$data['product_id']."' 
       , product_name = '".$data['product_name']."' 
      "; 
    $result2 = mysql_query($sql2); 
    **mysql_free_result($result2);** 
    } 
} 

감사합니다.

+3

당신이 인용 한 코드가 오직 설명을위한 것이길 바란다. 이것은 하나의 SQL 질의로 할 수있다. INSERT INTO another_table (product_id, product_name) SELECT product_id, product_name FROM products – symcbean

답변

18

mysql_free_result의 문서를 인용 :

mysql_free_result()은 당신이 많은 메모리가 큰 결과 집합을 반환하는 쿼리 에 사용되는 방식에 대해 우려하는 경우 를 호출 할 필요가있다.
관련된 결과 메모리는 스크립트의 실행이 끝나면 자동으로 해제되는 입니다. 문서는 그 함수를 호출하기 위해 일반적으로 필요가 없습니다 말한다면


그래서, 나는 그것이 정말 필요가 없습니다,도 좋습니다, 그냥 말, 그것은

을 ;-) 전화하고 말할 것입니다 : 나는 그 기능을 나 스스로 거의 부르지 않는다. 메모리가 스크립트의 끝에서 해제되고 각 스크립트는 을 너무 많이 사용해서는 안됩니다.
많은 양의 데이터를 처리해야하는 장기 실행 일괄 처리는 예외 일 수 있습니다 ...

1

실행되는 쿼리의 크기 또는 실행 한 쿼리 수에 따라 다릅니다. PHP는 스크립트가 끝날 때 메모리를 자동으로 해제하지만 실행 중에는 해제하지 않습니다. 따라서 쿼리에서 많은 양의 데이터를 가져 오는 경우 수동으로 결과를 더 잘 비우십시오.

내가 말할 것이다 : 당신이 개발하는 동안 메모리 나 스크립트에 대한 관심이 그 예, 그것은 mysql_free_result($result)를 사용하는 것이 좋습니다입니다

+0

"mysql_free_result) "자체적으로 호출하는 것이 반드시 좋은 개발자를 나타내는 좋은 지표는 아닙니다. – Kzqai

4

:-) 좋은 개발자를 만드는 것입니다 때문에 네, 좋습니다. 답변에 인용 된 문서가 정확하지 않습니다. 그것이 문서에서 말하는 것입니다 만, 그건 의미가 없습니다.

으로 mysql_free_result()는 당신이 큰 결과 집합을 반환하는 쿼리에 사용되는 메모리의 양에 대해 우려하는 경우 호출 할 필요가 : 여기 says는 것입니다. 모든 관련 결과 메모리는 스크립트가 실행될 때 자동으로 해제됩니다.

첫 번째 문장의 첫 부분이 정확합니다. 메모리 문제 이외의 이유로 사용하지 않아도되는 것은 사실입니다. 메모리 사용이 유일한 이유입니다. 그러나 첫 번째 문장의 두 번째 부분은 의미가 없습니다. 클레임은 큰 결과 집합을 반환하는 쿼리에 대해서만 메모리가 걱정된다는 것입니다. 메모리가 문제가되고 mysql_free_result()을 호출하는 일반적인 시나리오가 있기 때문에 이것은 매우 잘못된 것입니다. 검색어가 알 수없는 횟수만큼 실행될 수 있으면 mysql_free_result()으로 전화하지 않으면 더 많은 메모리가 소모됩니다. 따라서 루프 또는 함수 또는 메서드에서 쿼리를 실행하는 경우 일반적으로 mysql_free_result()을 호출하는 것이 좋습니다. 더 이상 사용하지 않을 때까지 결과를 해제하지 않도록 조심해야합니다.자신 만의 select() 및 ex() 함수를 만들어 결과 세트로 직접 작업하지 않으므로 언제 어떻게 사용하는지 생각하지 않아도됩니다. (여기에 어떤 코드도 실제로 쓰는 방법이 아니므로 더 많은 설명이 필요합니다. 클래스 또는 특수 네임 스페이스에 넣고 다른 예외 유형을 던지거나 $class_name 등과 같은 추가 매개 변수를 가져올 수 있습니다. .)

// call this for select queries that do not modify anything 
function select($sql) { 
    $array= array(); 
    $rs= query($sql); 
    while($o= mysql_fetch_object($rs)) 
     $array[]= $o; 
    mysql_free_result($rs); 
    return $array; 
} 

// call this for queries that modify data 
function ex($sql) { 
    query($sql); 
    return mysql_affected_rows(); 
} 

function query($sql) { 
    $rs= mysql_query($sql); 
    if($rs === false) { 
     throw new Exception("MySQL query error - SQL: \"$sql\" - Error Number: " 
      .mysql_errno()." - Error Message: ".mysql_error()); 
    } 
    return $rs; 
} 

을 이제 만 select()ex(), 당신은 단지 일반 개체 변수 대신 수동 메모리 관리의 일반 메모리 문제를 다루고있는 호출하는 경우. 객체 배열에서 사용중인 메모리의 양과 같은 일반적인 메모리 문제에 대해서도 고려해야합니다. 변수가 범위를 벗어나거나 수동으로 null로 설정하면 가비지 수집이 가능해 지므로 PHP가 처리합니다. 코드에서 더 이상 사용하지 않고 루프 나 다른 함수 호출과 같이 알 수없는 양의 메모리를 사용하는 연산이 있으면 범위를 벗어나기 전에 null로 설정하려고 할 수 있습니다. 후드에서 결과 집합과 함수가 어떻게 구현되는지 (그리고 내가 한 경우에도 이것은 PHP와 MySQL의 다른 버전/미래 버전에서 바뀔 수 있습니다), 따라서 select() 함수가 대략 두 배가 될 가능성이 있습니다 mysql_free_result($rs) 직전에 사용 된 메모리 양이 호출됩니다. 그러나 select()를 사용하면 루프 및 다양한 함수 호출 중에 점점 더 많은 메모리가 사용되는 것이 주된 관심사입니다. 이 두 배 메모리 사용 가능성에 대해 우려하고 있고 한 번에 한 행씩 한 행씩만 작업하는 경우 메모리 사용을 두 배로하지 않을 each() 함수를 만들 수 있습니다.

each($sql,$fun) { 
    $rs= query($sql); 
    while($o= mysql_fetch_object($rs)) 
     $fun($o); 
    mysql_free_result($rs); 
} 

당신은 다음과 같이 사용할 수 있습니다 : : 약 mysql_free_result() 생각

each("SELECT * FROM users", function($user) { 
    echo $user->username."<BR>"; 
}); 

당신이 있는지에 대해 생각하지 않아도이, 아무것도 반환하지 않는 것을 각()는 사용의 또 다른 장점 나중에 널 (NULL)로 리턴 값을 설정하지 마십시오.

0

답변은 물론 mysqli에서 그렇습니다.
PHP mysqli_free_result documentation에서보세요 : 당신의 결과 개체가 더 이상 필요하지 않을 때 당신은 항상 mysqli_free_result하여 결과를(), 해제해야

.

나는 memory_get_usage 기능을 테스트하는 데 사용 :

echo '<br>before mysqli free result: '.memory_get_usage(); 
mysqli_free_result($query[1]); 
echo '<br>after mysqli free result'.memory_get_usage(); 

그리고 결과입니다, 우리의 1000 행에 대한 151,344 bytes 메모리를 얘기하는

before mysqli free result:2110088 
after mysqli free result:1958744 

그리고 여기 mysql 테이블. 백만 줄은 어떨까요? 대형 프로젝트를 어떻게 생각합니까?
mysqli_free_result()은 대용량 데이터 일뿐만 아니라 소규모 프로젝트에도 적합합니다.

관련 문제