:-) 좋은 개발자를 만드는 것입니다 때문에 네, 좋습니다. 답변에 인용 된 문서가 정확하지 않습니다. 그것이 문서에서 말하는 것입니다 만, 그건 의미가 없습니다.
으로 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)로 리턴 값을 설정하지 마십시오.
당신이 인용 한 코드가 오직 설명을위한 것이길 바란다. 이것은 하나의 SQL 질의로 할 수있다. INSERT INTO another_table (product_id, product_name) SELECT product_id, product_name FROM products – symcbean