現在の位置: ホーム> 最新記事一覧> $ errnoベースのエラーRetryロジックを構築する方法

$ errnoベースのエラーRetryロジックを構築する方法

M66 2025-05-17

PHPアプリケーションを開発する場合、データベース操作の安定性が重要です。特に、高い電流アプリケーションの場合、データベース接続の障害またはクエリエラーに対処し、効率的なエラー再試行メカニズムを実装する方法は、多くの開発者が直面する問題になりました。この記事では、 MySqli :: $ errnoを使用して効率的なエラー再ターリーロジックを実装して、データベース操作の安定性を向上させる方法について説明します。

mysqli :: $ errnoとは何ですか?

PHPのMySQLI拡張機能では、 $ ERRNO属性が最後のMySQL操作のエラーコードを保存します。データベース操作を実行すると、エラーが発生した場合、MySQLはエラーコードを返し、このエラーコードはMySQLI :: $ errnoプロパティを介して取得できます。エラーコードに応じて、再試行するかどうかを決定できます。

エラー再試行シナリオ

データベース操作の一般的なエラーは次のとおりです。

  • 一時的なネットワークの停止

  • データベース接続の数が上限に達します

  • MySQLサービスは一時的に利用できません。

これらのエラーは通常一時的なものであり、適切な再試行戦略を通じてアプリケーションの安定性を改善できます。エラータイプをすばやく決定し、適切なタイミングで再試行できる場合、時折エラーによって引き起こされるデータベースの操作障害の可能性を大幅に減らすことができます。

エラー再試行ロジックを作成します

次に、 mysqli :: $ errnoに基づいてエラー再試行ロジックを実装します。データベースに接続し、接続が失敗した場合に再試行してみます。

 <?php
// データベース接続パラメーターを設定します
$host = 'localhost';
$username = 'root';
$password = '';
$database = 'test_db';

// 再試行時間の最大数を設定します
$maxRetries = 3;
$retryInterval = 2; // 再試行時間(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;
}

// retry関数を呼び出します
$connection = tryConnection($host, $username, $password, $database, $maxRetries, $retryInterval);
if ($connection) {
    echo "数据库接続に正常に!\n";
    // 他のデータベース操作を実行します...
} else {
    echo "データベースに接続できません,後でもう一度やり直してください。\n";
}
?>

コードを説明してください

  1. 接続関数CreateConnection() :この関数は、MySQLデータベース接続を作成し、接続オブジェクトを返すために使用されます。接続が失敗した場合、 falseが返されます。

  2. retry関数tryconnection() :この関数では、再試行メカニズムを実装します。データベースに接続しようとし、接続が失敗した場合、エラーコードに基づいて再試行するかどうかを決定します。 connect_errnoを使用してエラーコードを取得し、一時的な接続エラー(ネットワークの問題、データベース接続が多すぎるなど)であるかどうかを確認します。もしそうなら、最大レトリの数に達するまで再試行する前にしばらく待ちます。

  3. エラーコードの判断

    • エラーコード2002は、データベースサーバーを接続できないことを示します。

    • エラーコード1040は、データベース接続が多すぎることを示します。

さらなる最適化

さまざまなエラーについてより賢明な決定を下すために、より多くのエラーコードを通じて判断を下すことができます。例えば:

  • エラーコード2003 :MySQLサーバーへの接続がアクセスできないか、サーバーが起動しないことを示します。

  • エラーコード1045 :ユーザー名またはパスワードが間違っていることを示します。これは明示的な構成エラーであり、再試行しないでください。

エラーコードごとに、別の再試行間隔を設定するか、再試行を直接終了することができます。

要約します

MySqli :: $ errnoを使用してデータベース操作のエラータイプを決定することにより、ネットワークの中断または一時的なエラーによって引き起こされるデータベース接続の障害を回避するために、効率的なエラー再試行メカニズムを実装できます。再試行時間と再試行間隔の最大数を合理的に設定すると、特に高い並行性環境でのデータベース操作の安定性を効果的に改善できます。これらのスキルを習得することで、アプリケーションとデータベースの間の相互作用をより適切に制御し、システムの信頼性を確保できます。