Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

PHP에서 mysql_free_result()로 MySQL 쿼리 결과의 커서 메모리 해제하기

개요

PHP에서는 mysql_free_result() 함수를 사용하여 MySQL 쿼리 결과와 연관된 커서(cursor) 메모리를 해제할 수 있습니다. 대량의 데이터를 조회한 후 이 함수를 호출하면 불필요하게 점유되던 메모리를 즉시 반환하여 서버 리소스를 효율적으로 관리할 수 있습니다.

아래 예제를 통해 실제 사용 방법을 살펴보겠습니다.

예제: 조회 후 메모리 해제하기

다음 PHP 스크립트는 'Tutorials_tbl' 테이블에서 레코드를 모두 가져온 뒤, mysql_free_result()를 호출하여 결과 세트가 차지하던 메모리를 해제합니다.

<?php
    $dbhost = 'localhost:3036';
    $dbuser = 'root';
    $dbpass = 'rootpassword';
    $conn = mysql_connect($dbhost, $dbuser, $dbpass);
    
    if(! $conn )  {
        die('Could not connect: ' . mysql_error());
    }
    
    $sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date
        FROM tutorials_tbl';
    mysql_select_db('TUTORIALS');
    $retval = mysql_query( $sql, $conn );

    if(! $retval ) {
        die('Could not get data: ' . mysql_error());
    }

    while($row = mysql_fetch_array($retval, MYSQL_NUM)) {
        echo "Tutorial ID :{$row[0]} <br> ".
            "Title: {$row[1]} <br> ".
            "Author: {$row[2]} <br> ".
            "Submission Date : {$row[3]} <br> ".
            "--------------------------------<br>";
    }
    mysql_free_result($retval);
    echo "Fetched data successfully\n";
    mysql_close($conn);
?>

코드 설명

위 스크립트의 핵심 흐름은 다음과 같습니다.

1. 데이터베이스 연결: mysql_connect()로 MySQL 서버에 접속하고, 실패 시 die()로 오류 메시지와 함께 종료합니다.

2. 쿼리 실행: tutorials_tbl 테이블에서 튜토리얼 ID, 제목, 작성자, 제출일을 조회합니다.

3. 결과 출력: mysql_fetch_array()를 반복 호출하면서 각 행의 데이터를 화면에 출력합니다.

4. 메모리 해제: 모든 레코드 처리가 끝나면 mysql_free_result($retval)를 호출하여 결과 세트와 관련된 커서 메모리를 반환합니다.

5. 연결 종료: 마지막으로 mysql_close($conn)으로 데이터베이스 연결을 닫습니다.

참고: 최신 PHP 환경에서의 주의사항

위 예제에서 사용한 mysql_* 계열 함수는 PHP 5.5부터 지원이 중단(deprecated)되었으며, PHP 7에서 완전히 제거되었습니다. 따라서 최신 프로젝트에서는 다음과 같은 대체 방식을 사용하는 것이 좋습니다.

  • MySQLi 확장: 동일한 역할을 하는 mysqli_free_result() 함수를 제공하며, 절차적(procedural) 방식과 객체지향(OOP) 방식을 모두 지원합니다.
  • PDO(PHP Data Objects): 여러 데이터베이스를 일관된 인터페이스로 다룰 수 있어 이식성이 뛰어납니다.

즉, 구조와 개념은 동일하게 유지하되, 실무 코드에서는 mysqli 또는 PDO 기반으로 작성하는 것이 안전합니다.