현재 위치: > 최신 기사 목록> $ errno 기반 오류 레트리 로직을 구축하는 방법

$ errno 기반 오류 레트리 로직을 구축하는 방법

M66 2025-05-17

PHP 애플리케이션을 개발할 때 데이터베이스 작업의 안정성이 중요합니다. 특히 대결성 응용 프로그램의 경우 데이터베이스 연결 고장 또는 쿼리 오류를 처리하고 효율적인 오류 재시도 메커니즘을 구현하는 방법이 많은 개발자가 직면 한 문제가되었습니다. 이 기사에서는 MySQLI :: $ errno를 사용하여 데이터베이스 작업의 안정성을 향상시키기 위해 효율적인 오류 레트리 로직을 구현하는 방법을 살펴 봅니다.

mysqli :: $ errno 란 무엇입니까?

PHP의 MySQLI Extension에서 $ errno 속성은 마지막 MySQL 작업의 오류 코드를 저장합니다. 데이터베이스 작업을 수행 할 때 오류가 발생하면 MySQL은 오류 코드를 반환하고 MySQLI :: $ errno 속성을 통해이 오류 코드를 얻을 수 있습니다. 오류 코드에 따라 재 시도 여부를 결정할 수 있습니다.

오류 재 시도 시나리오

데이터베이스 작업의 일반적인 오류는 다음과 같습니다.

  • 임시 네트워크 중단

  • 데이터베이스 연결 수는 상한에 도달합니다

  • MySQL 서비스는 일시적으로 사용할 수 없습니다.

이러한 오류는 일반적으로 일시적이며 적절한 재 시도 전략을 통해 응용 프로그램의 안정성을 향상시킬 수 있습니다. 오류 유형을 신속하게 결정하고 적시에 재 시도 할 수 있다면 가끔 오류로 인한 데이터베이스 작동 실패 가능성을 크게 줄일 수 있습니다.

오류 리트리 로직을 구축하십시오

다음으로 MySQLI :: $ errno를 기반으로 오류 재 시도 로직을 구현합니다. 데이터베이스에 연결하려고 시도하고 연결이 실패하면 다시 시도합니다.

 <?php
// 데이터베이스 연결 매개 변수를 설정합니다
$host = 'localhost';
$username = 'root';
$password = '';
$database = 'test_db';

// 레트리 시간의 최대 수를 설정하십시오
$maxRetries = 3;
$retryInterval = 2; // 재 시도 간격 시간(두번째)

// 데이터베이스 연결을 만듭니다
function createConnection($host, $username, $password, $database) {
    $connection = new mysqli($host, $username, $password, $database);
    
    // 연결이 성공했는지 확인하십시오
    if ($connection->connect_error) {
        echo "연결이 실패했습니다: " . $connection->connect_error . "\n";
        return false;
    }
    return $connection;
}

// 연결을 시도하고 다시 시도하십시오
function tryConnection($host, $username, $password, $database, $maxRetries, $retryInterval) {
    $retries = 0;
    $connection = null;
    
    while ($retries < $maxRetries) {
        $connection = createConnection($host, $username, $password, $database);
        if ($connection) {
            // 연결이 성공적으로 연결됩니다,연결 객체로 돌아갑니다
            return $connection;
        }
        
        // 오류 코드를 가져옵니다
        $errno = $connection->connect_errno;
        
        // 오류 코드를 기반으로 임시 오류인지 확인
        if ($errno == 2002 || $errno == 1040) {
            // 예를 들어:2002데이터베이스 서버를 연결할 수 없음을 나타냅니다,1040데이터베이스 연결이 너무 많음을 나타냅니다
            echo "数据库연결이 실패했습니다,다시 시도...(오류 코드:$errno)\n";
            $retries++;
            sleep($retryInterval); // 다시 시도하기 전에 잠시 기다리십시오
        } else {
            // 오류가 다른 유형 인 경우,재 시도를 종료하십시오
            echo "연결이 실패했습니다,오류 코드:$errno\n";
            break;
        }
    }
    
    if ($retries == $maxRetries) {
        echo "최대 재 시도 수,데이터베이스에 연결할 수 없습니다。\n";
        return null;
    }
    
    return $connection;
}

// 재 시도 기능을 호출하십시오
$connection = tryConnection($host, $username, $password, $database, $maxRetries, $retryInterval);
if ($connection) {
    echo "数据库연결이 성공적으로 연결됩니다!\n";
    // 다른 데이터베이스 작업을 수행하십시오...
} else {
    echo "데이터베이스에 연결할 수 없습니다,나중에 다시 시도하십시오。\n";
}
?>

코드를 설명하십시오

  1. 연결 함수 createConnection () :이 함수는 MySQL 데이터베이스 연결을 생성하고 연결 객체를 반환하는 데 사용됩니다. 연결이 실패하면 False가 반환됩니다.

  2. 재 시도 기능 tryconnection () :이 기능에서는 재 시도 메커니즘을 구현합니다. 데이터베이스에 연결하려고 시도하며 연결이 실패하면 오류 코드를 기반으로 재 시도할지 여부가 결정됩니다. Connect_erRNO를 사용하여 오류 코드를 가져 와서 임시 연결 오류인지 확인합니다 (예 : 네트워크 문제, 너무 많은 데이터베이스 연결 등). 그렇다면 최대 리트리에 도달 할 때까지 다시 시도하기 전에 잠시 기다릴 것입니다.

  3. 오류 코드의 판단 :

    • 오류 코드 2002는 데이터베이스 서버를 연결할 수 없음을 나타냅니다.

    • 오류 코드 1040은 데이터베이스 연결이 너무 많음을 나타냅니다.

추가 최적화

우리는 더 많은 오류 코드를 통해 판단하여 다른 오류에 대한 더 똑똑한 결정을 내릴 수 있습니다. 예를 들어:

  • 오류 코드 2003 : MySQL 서버에 대한 연결이 액세스 할 수 없거나 서버가 시작되지 않았 음을 나타냅니다.

  • 오류 코드 1045 : 사용자 이름이나 비밀번호가 잘못되었음을 나타냅니다. 이것은 명시적인 구성 오류이며 재 시도해서는 안됩니다.

각 오류 코드에 대해 다른 재 시도 간격을 설정하거나 재 시도를 직접 종료 할 수 있습니다.

요약

MySQLI :: $ errno를 사용하여 데이터베이스 작업의 오류 유형을 결정함으로써 네트워크 중단 또는 임시 오류로 인한 데이터베이스 연결 고장을 피하기 위해 효율적인 오류 재 시도 메커니즘을 구현할 수 있습니다. 합리적으로 재시도 시간과 재 시도 간격을 합리적으로 설정하면 특히 높은 동시성 환경에서 데이터베이스 작업의 안정성을 효과적으로 향상시킬 수 있습니다. 이러한 기술을 마스터하면 응용 프로그램과 데이터베이스 간의 상호 작용을 더 잘 제어하고 시스템의 신뢰성을 보장 할 수 있습니다.