PHP 애플리케이션을 개발할 때 데이터베이스 작업의 안정성이 중요합니다. 특히 대결성 응용 프로그램의 경우 데이터베이스 연결 고장 또는 쿼리 오류를 처리하고 효율적인 오류 재시도 메커니즘을 구현하는 방법이 많은 개발자가 직면 한 문제가되었습니다. 이 기사에서는 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";
}
?>
연결 함수 createConnection () :이 함수는 MySQL 데이터베이스 연결을 생성하고 연결 객체를 반환하는 데 사용됩니다. 연결이 실패하면 False가 반환됩니다.
재 시도 기능 tryconnection () :이 기능에서는 재 시도 메커니즘을 구현합니다. 데이터베이스에 연결하려고 시도하며 연결이 실패하면 오류 코드를 기반으로 재 시도할지 여부가 결정됩니다. Connect_erRNO를 사용하여 오류 코드를 가져 와서 임시 연결 오류인지 확인합니다 (예 : 네트워크 문제, 너무 많은 데이터베이스 연결 등). 그렇다면 최대 리트리에 도달 할 때까지 다시 시도하기 전에 잠시 기다릴 것입니다.
오류 코드의 판단 :
오류 코드 2002는 데이터베이스 서버를 연결할 수 없음을 나타냅니다.
오류 코드 1040은 데이터베이스 연결이 너무 많음을 나타냅니다.
우리는 더 많은 오류 코드를 통해 판단하여 다른 오류에 대한 더 똑똑한 결정을 내릴 수 있습니다. 예를 들어:
오류 코드 2003 : MySQL 서버에 대한 연결이 액세스 할 수 없거나 서버가 시작되지 않았 음을 나타냅니다.
오류 코드 1045 : 사용자 이름이나 비밀번호가 잘못되었음을 나타냅니다. 이것은 명시적인 구성 오류이며 재 시도해서는 안됩니다.
각 오류 코드에 대해 다른 재 시도 간격을 설정하거나 재 시도를 직접 종료 할 수 있습니다.
MySQLI :: $ errno를 사용하여 데이터베이스 작업의 오류 유형을 결정함으로써 네트워크 중단 또는 임시 오류로 인한 데이터베이스 연결 고장을 피하기 위해 효율적인 오류 재 시도 메커니즘을 구현할 수 있습니다. 합리적으로 재시도 시간과 재 시도 간격을 합리적으로 설정하면 특히 높은 동시성 환경에서 데이터베이스 작업의 안정성을 효과적으로 향상시킬 수 있습니다. 이러한 기술을 마스터하면 응용 프로그램과 데이터베이스 간의 상호 작용을 더 잘 제어하고 시스템의 신뢰성을 보장 할 수 있습니다.