PHP를 사용하여 MySQL 데이터베이스를 작동 할 때 많은 개발자가 MySQLI 확장을 사용하여 데이터베이스 작업을 수행하는 데 익숙합니다. 그러나 많은 사람들이 쿼리 후 하나의 세부 사항을 무시합니다. $ result-> free () (또는 mysqli_free_result () )가 정말 중요합니까? 왜 생략 할 수 없습니까? 이 기사는 자세히 설명합니다.
mysqli_query ()를 사용하여 쿼리 문을 실행할 때 (예 :
$mysqli = new mysqli("localhost", "username", "password", "database");
$result = $mysqli->query("SELECT * FROM users");
여기서 $ 결과는 mysqli_result 객체로 쿼리에서 반환 한 모든 데이터를 저장합니다. 메모리 리소스를 소비합니다. 특히 쿼리 결과가 클 때 메모리 소비가 크게 증가합니다.
많은 사람들은 PHP가 메모리를 자동으로 관리하고 스크립트가 끝나면 자동으로 변수를 정리한다고 생각합니다. 그러나 사실은 다음과 같습니다.
? 스크립트가 끝나면 메모리가 자동으로 청소됩니다.
? 그러나 스크립트 실행 중에 여러 쿼리 또는 큰 쿼리가 있고 적극적으로 해제되지 않으면 메모리 압력이 커질 것입니다.
예를 들어:
for ($i = 0; $i < 1000; $i++) {
$result = $mysqli->query("SELECT * FROM big_table");
// 결과 세트가 해제되지 않습니다
}
위의 코드에서 각 루프는 결과 세트 객체를 생성하지만 해제되지 않습니다. 이렇게하면 메모리 상승이 유지되므로 결국 메모리 오버플 로 또는 성능 강하가 급격히 떨어질 수 있습니다.
$ result-> free ()를 추가하는 경우 :
for ($i = 0; $i < 1000; $i++) {
$result = $mysqli->query("SELECT * FROM big_table");
$result->free();
}
이러한 방식으로, 각 루프가 끝나면 결과 세트가 차지하는 메모리가 제 시간에 해제되어 메모리 사용량이 크게 줄어 듭니다.
두 가지 방법이 있습니다.
1 ??? 객체 지향 스타일 :
$result = $mysqli->query("SELECT * FROM users");
if ($result) {
// 처리 결과...
$result->free();
}
2 ?? 프로세스 스타일 :
$result = mysqli_query($mysqli, "SELECT * FROM users");
if ($result) {
// 처리 결과...
mysqli_free_result($result);
}
참고 : 쿼리가 실패하면 ( False를 반환) Free ()을 호출하면 오류가보고되므로 먼저 $ result가 유효한 개체인지 확인해야합니다.
짧은 스크립트와 단일 쿼리와 차이를 느끼지 못할 수도 있습니다. 그러나 이러한 시나리오에서는 결과 세트를 공개하지 않으면 심각한 결과가있을 것입니다.
빅 데이터 쿼리 : 수만 또는 수십만 행을 쿼리 할 때 결과 세트는 많은 메모리를 차지합니다.
장기 실행 스크립트 : 시간이 지정된 작업, 크롤러 및 데몬과 같은.
높은 동시 웹 서비스 : 각 요청은 메모리를 소비하고 서버를 오랫동안 끌어냅니다.
이 경우 결과 세트가 해제되지 않으며 응용 프로그램의 속도가 느려질 수 있으며 서버는 최악의 상황에서 충돌 할 수 있습니다.
한 문장을 기억하십시오 : 중고 자원은 수동으로 릴리스해야합니다!
PHP가 메모리를 자동으로 재활용하더라도 실행중인 자원을 관리하는 데 의존하지 마십시오.
실제 개발에서 "올바른"코드를 작성할뿐만 아니라 "좋은"코드를 작성하는 쿼리 후에 좋은 습관 - $ result-> free () 가시기 적절합니다.