PHP 개발에서는 fetch_object 함수를 사용하여 데이터베이스의 객체 형태로 결과를 설정하는 것이 매우 일반적입니다. 이를 통해 개발자는 객체 지향 방식으로 데이터를 조작 할 수 있으며 코드 구조는 명확합니다. 그러나 동시성이 높은 스크립트 또는 장기 실행 스크립트에서 Fetch_Object 가 반환 한 객체 리소스가 제대로 관리되지 않으면 메모리 누출을 유발할 수있어 시스템 성능에 영향을 미치고 심지어 충돌을 일으킬 수 있습니다.
이 기사는 fetch_object 의 작동 원리로 시작하여 메모리 누출의 원인을 깊이 분석하며보다 강력하고 효율적인 PHP 코드를 작성하는 데 도움이되는 실용적인 메모리 관리 기술을 제공합니다.
fetch_object 는 php의 mysqli_result 클래스의 방법 중 하나이며, 결과에서 레코드를 객체로 변환하는 데 사용됩니다. 예제는 다음과 같습니다.
$mysqli = new mysqli("m66.net", "user", "password", "database");
$result = $mysqli->query("SELECT * FROM users");
while ($obj = $result->fetch_object()) {
echo $obj->username . "<br>";
}
여기서는 fetch_object가 호출 될 때마다 새 개체 인스턴스가 반환되어 현재 행의 데이터를 보유합니다.
결과 세트 리소스가 제 시간에 해제되지 않은 리소스 <br> 쿼리 결과가 오랫동안 해제되지 않으면 mysqli_result가 많은 메모리를 차지합니다. PHP 스크립트는 끝 부분에 자동으로 정리되지만 긴 스크립트 또는 데몬으로 수동으로 릴리스해야합니다.
많은 객체가 루프로 생성되었고 제 시간에 파괴되지 않았습니다.
fetch_object는 새로운 객체를 지속적으로 생성하고, 이러한 객체가 외부에 참조되거나 배열에 저장되고 정리되지 않으면 메모리가 계속 커질 것입니다.
복잡한 객체 참조로 인해 메모리가 재활용됩니다 <br> Fetch에 의해 얻어진 객체에 다른 큰 자원을 참조하는 속성이 포함되거나 물체가 서로를 참조하면 PHP 쓰레기 수집 메커니즘이 시간에 재활용되지 않아 메모리 축적을 초래할 수 있습니다.
쿼리가 완료된 후에는 지속적인 메모리 소비를 피하기 위해 자원을 해제하기 위해 $ result-> free ()를 호출하십시오.
$result = $mysqli->query("SELECT * FROM users");
while ($obj = $result->fetch_object()) {
// 처리 데이터
}
$result->free();
Fetch_Object 의 결과를 배열로 저장하면 처리 후 배열을 명시 적으로 지우십시오.
$objects = [];
while ($obj = $result->fetch_object()) {
$objects[] = $obj;
}
// 모든 객체를 처리합니다
unset($objects);
$result->free();
이것은 PHP가 메모리를 더 빨리 재활용하는 데 도움이 될 수 있습니다.
객체를 오랫동안 저장할 필요가 없다면, 객체 축적을 피하기 위해 루프에서 처리 한 후 참조를 해제하십시오.
메모리 압력이 높으면 fetch_assoc ()을 대신 대신 객체 대신 배열을 반환하고 메모리 사용을 줄일 수 있습니다.
while ($row = $result->fetch_assoc()) {
// 배열을 사용하여 데이터에 액세스하십시오
}
코드 스타일은 다르지만 메모리 친화적입니다.
<?php
$mysqli = new mysqli("m66.net", "user", "password", "database");
if ($mysqli->connect_error) {
die("연결이 실패했습니다:" . $mysqli->connect_error);
}
$result = $mysqli->query("SELECT * FROM users");
if ($result) {
while ($obj = $result->fetch_object()) {
echo "사용자 이름: " . $obj->username . "<br>";
// 처리 후 저장되지 않은 경우,변수를 직접 릴리스하십시오
unset($obj);
}
// 결과 세트를 릴리스하십시오
$result->free();
} else {
echo "쿼리가 실패했습니다:" . $mysqli->error;
}
$mysqli->close();
?>
fetch_object 는 데이터 조작에 편리하지만 많은 객체를 생성하면 메모리 압력이 생길 것입니다.
메모리 누출을 방지하기 위해 결과 세트를 해제하고 물체를 파괴하는 습관을 개발해야합니다.
Fetch_assoc 과 적절한 메모리 관리 정책을 결합하면 PHP 스크립트의 메모리 사용량을 효과적으로 제어 할 수 있습니다.
장기 실행 스크립트의 경우 메모리 모니터링 및 관리에 특별한주의를 기울이십시오.
위의 기술을 습득하면 많은 양의 데이터를 처리 할 때 PHP 프로그램을보다 안정적이고 효율적으로 만들 수 있으며 메모리 누출로 인한 성능 병목 현상을 피할 수 있습니다.