PHP에서 Next_result () 는 MySQLI 확장에서 일반적인 메소드이며 일반적으로 여러 쿼리를 실행할 때 사용됩니다. 그러나 많은 개발자가 Next_result ()를 사용할 때 리소스 릴리스를 무시할 수있어 메모리 누출 및 성능 문제가 발생할 수 있습니다. 이를 피하기 위해이 기사에서는 Next_result ()를 사용할 때 리소스를 올바르게 릴리스 할 수 있도록 3 가지 실용적인 팁을 공유합니다.
여러 쿼리가 실행되면 Next_Result ()는 각 쿼리의 결과 세트를 읽고 처리합니다. 결과 세트가 제 시간에 해제되지 않으면 항상 메모리를 선택합니다. 이를 피하려면 결과를 처리 한 후 Free_Result () 메소드를 호출하십시오.
샘플 코드 :
<?php
// 데이터베이스 연결을 만듭니다
$mysqli = new mysqli("localhost", "username", "password", "database");
// 여러 쿼리를 수행하십시오
$mysqli->multi_query("SELECT * FROM table1; SELECT * FROM table2;");
// 첫 번째 결과 세트를 처리하십시오
do {
if ($result = $mysqli->store_result()) {
// 처리 데이터
while ($row = $result->fetch_assoc()) {
echo $row['column_name'];
}
// 첫 번째 결과 세트를 정리하십시오
$result->free();
}
// 다음 결과 세트로 이동하십시오
} while ($mysqli->next_result());
?>
위의 코드에서 첫 번째 쿼리 결과 세트를 처리 한 후 $ result-> free ()를 호출하여 리소스를 확보합니다. 그런 다음 다음 쿼리의 결과 세트는 Next_result () 에 의해 계속됩니다.
Multi_Query ()를 사용하여 여러 쿼리를 실행하면 쿼리 중 하나가 실패하면 후속 쿼리 결과가 정상적으로 해제되지 않을 수 있습니다. 이 경우 반환 된 오류 메시지를 확인하여 각 쿼리의 결과 세트가 정리 될 수 있습니다.
샘플 코드 :
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
// 여러 쿼리 문을 실행하십시오
$query = "SELECT * FROM table1; SELECT * FROM table2;";
if ($mysqli->multi_query($query)) {
do {
if ($result = $mysqli->store_result()) {
// 처리 데이터
while ($row = $result->fetch_assoc()) {
echo $row['column_name'];
}
// 결과 세트를 정리하십시오
$result->free();
}
} while ($mysqli->next_result());
} else {
echo "Error: " . $mysqli->error;
}
?>
이 예에서 Multi_Query () 가 실행되지 않으면 코드는 후속 쿼리를 계속 실행하는 대신 오류 메시지를 출력하여 리소스 점유 자원이없는 결과 세트를 방지합니다.
일부 시나리오에서 쿼리 순서가 트랜잭션 처리와 관련이있는 경우 트랜잭션을 사용하여 쿼리를 원활하게 실행하고 각 쿼리의 릴리스를 수동으로 관리 할 수 있습니다. 이는 잘못된 쿼리 순서로 인해 리소스의 미숙증 문제를 피할 수 있습니다.
샘플 코드 :
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
// 거래를 시작하십시오
$mysqli->begin_transaction();
try {
// 첫 번째 쿼리를 실행하십시오
$mysqli->query("SELECT * FROM table1;");
// 두 번째 쿼리를 실행하십시오
$mysqli->query("SELECT * FROM table2;");
// 거래를 제출하십시오
$mysqli->commit();
} catch (Exception $e) {
// 오류가 발생하면 트랜잭션이 롤백됩니다.
$mysqli->rollback();
echo "Failed: " . $e->getMessage();
} finally {
// 모든 결과 세트를 정리하십시오
while ($mysqli->more_results()) {
$mysqli->next_result();
}
}
?>
이 예에서는 트랜잭션을 사용하여 여러 쿼리를 처리하고 실행이 완료된 후 모든 쿼리의 결과 세트를 해제하기 위해 Next_Result () 가 호출되어 있는지 확인하십시오.
next_result ()를 사용할 때 리소스를 피하는 문제를 피하려면 다음 사항을 따라야합니다.
각 쿼리 결과 프로세스 후에는 free_result ()를 호출하여 리소스를 확보하십시오.
Multi_Query ()를 사용하여 여러 쿼리를 실행할 때 오류 처리에주의를 기울이고 각 쿼리의 결과가 올바르게 정리되어 있는지 확인하십시오.
트랜잭션을 사용하는 경우 쿼리 순서를 수동으로 제어하고 모든 쿼리가 실행 된 후 모든 결과 세트가 정리되어 있는지 확인하십시오.
이 팁을 따르면 발표되지 않은 리소스를 효과적으로 피할 수 있으므로 응용 프로그램 성능 및 안정성을 향상시킬 수 있습니다.