현재 위치: > 최신 기사 목록> next_result ()를 사용한 후 결과 세트를 제거하지 않아 메모리 누출 문제

next_result ()를 사용한 후 결과 세트를 제거하지 않아 메모리 누출 문제

gitbox 2025-04-29

PHP를 사용하여 MySQL 데이터베이스를 조작 할 때 MySQLI Extension을 사용하면 Next_Result () 메소드가 발생할 수 있습니다. 그리고 많은 사람들이 중요한 세부 사항을 무시합니다.

이 기사에서는 원인, 징후 및이 문제를 피하는 방법을 보여줍니다.

배경 : Next_result는 무엇입니까 ()

mysqli :: multi_query ()를 통해 여러 SQL을 실행하면 MySQL은 여러 결과 세트를 반환합니다. 이 결과 세트는 mysqli :: next_result () 를 통해 하나씩 액세스 할 수 있으며 각 결과의 내용은 mysqli :: store_result () 와 함께 얻을 수 있습니다.

샘플 코드 :

 $mysqli = new mysqli("localhost", "user", "password", "database");

$sql = "SELECT * FROM users; SELECT * FROM orders;";
if ($mysqli->multi_query($sql)) {
    do {
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_assoc()) {
                // 각 데이터 행을 처리합니다
                echo $row["id"] . "<br>";
            }
            // 결과 세트를 릴리스하십시오
            $result->free();
        }
    } while ($mysqli->next_result());
}

이 예에서는 매번 store_result () 를 통해 결과 세트를 가져 와서 사용 후 $ result-> free () 를 통해 해제하십시오.

문제 : 결과 세트의 출시가 없습니다

다음과 같이 $ result-> free ()를 생략하면 :

 // ? 未결과 세트를 릴리스하십시오的代码示例
if ($result = $mysqli->store_result()) {
    while ($row = $result->fetch_assoc()) {
        echo $row["id"] . "<br>";
    }
    // 무시했습니다 $result->free();
}

그러면 프로그램의 메모리 사용량은 특히 다량의 데이터 또는 높은 동시 요청을 처리 할 때이 메모리 누출이 매우 분명합니다. MySQLI Extension은 클라이언트 메모리에서 결과 세트를 캐시하기 때문에 PHP는 명시 적으로 공개하여 이러한 리소스를 재활용 할 수 있습니다.

메모리 누출의 결과

  • 프로그램이 오랫동안 실행 된 후 메모리가 급증합니다.

  • 서버 응답이 느려지거나 심지어 충돌합니다.

  • PHP는 허용 메모리 크기가 소진 된 오류를보고합니다.

  • 추적되지 않은 성능 문제.

이것은 특히 교통량이 많은 API, 타이밍 작업 또는 데몬에서 치명적입니다.

올바른 방법

결과 세트를 처리 한 후 항상 $ result-> free () 를 호출하십시오. 또한 새로운 결과 세트가 있는지 확인하고 각 호출 후에 다음 ext_result ()를 처리 한 후 처리하십시오.

완전한 누출 방지 템플릿 :

 $mysqli = new mysqli("localhost", "user", "password", "database");

$sql = "CALL complex_procedure(); CALL another_procedure();";
if ($mysqli->multi_query($sql)) {
    do {
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_assoc()) {
                // 각 라인을 처리하십시오
            }
            $result->free(); // ? 올바르게 릴리스하십시오
        }
    } while ($mysqli->more_results() && $mysqli->next_result());
}

누출을 감지하는 방법

  • 메모리 사용량을 모니터링하기 위해 Memory_Get_usage () 또는 XdeBug 도구를 사용하십시오.

  • 상단 또는 HTOP 와 같은 Linux 명령을 사용하여 프로세스 메모리를 모니터링합니다.

  • 각 쿼리 후에 메모리 사용량을 기록합니다.

요약

mysqli :: next_result ()를 사용할 때 결과 세트를 출시하지 않으면 PHP 스크립트에서 메모리 누출이 발생합니다. 올바른 방법은 결과 세트가 처리 될 때마다 $ result-> free () 를 호출하는 것입니다. 이것은 프로그램을 강력하게 유지할뿐만 아니라 과도한 메모리 사용으로 인한 성능 문제를 피합니다.

데이터를 배치로 처리하는 복잡한 데이터 인터페이스 또는 서비스를 구축하는 경우 특히 중요합니다.

MySQLI Multi-Result Set Processing에 대한 더 많은 공식 문서를 보려면 다음에 액세스 할 수 있습니다.
https://gitbox.net/docs/php/mysqli-multi-query (가정 된 링크)

이 기사가 PHP 개발의 일반적인 함정을 피하는 데 도움이되기를 바랍니다.