Comment puis-je vérifier une connexion PDO MySQL pour les erreurs avant que j'exécuter une requête?

StackOverflow https://stackoverflow.com/questions/6832190

  •  27-10-2019
  •  | 
  •  

Question

Mes scripts sont tout à fait se criblé de processus fork beaucoup de fonctions différentes. Chaque fois que pcntl_fork() est appelée, toutes les connexions de MySQL sont perdus. Si je lance une requête sur une connexion PDO MySQL je reçois le "MySQL server has gone away" d'erreur.

Le problème est que cette erreur ne montre que dans PDO::errorinfo() après une exécution de la requête a échoué. Je voudrais être en mesure de détecter si le serveur MySQL « a disparu » avant d'essayer d'exécuter une requête. De cette façon, je pourrais créer un emballage qui fait PDO une nouvelle connexion pour moi dans de telles situations.

Toutes les idées?

Était-ce utile?

La solution

Je vous donne 2 méthodes par exemple (similaire à certains égards):
Exemple 1:

$sql = 'SELECT count(*) FROM `TABLE`;';
for ($i = 1; $i <= 2; $i++) {
    try {
        $nb = $pdo->query($sql)->fetchColumn();
        if (is_int($nb)) {
            // OK
            break;
        }
    } catch (PDOException $e) {
    //Oups
        if ($i == 1) {
            // First time ? retry
            $pdo = new PDO($dsn, $user, $password);
        } else {
            // Second time, KO
            $nb = "(unknown)";
            echo 'PDO Connection failed: ' . $e->getMessage().'. ';
        }
    }
}

Exemple 2:

// check
try {
    $pdo->query('select 1;')
    //OK
} catch (PDOException $e) {
    //Oups => reconnect
    $pdo = new PDO($dsn, $user, $password);
}
// Should be good
$sql = 'SELECT count(*) FROM `TABLE`;';
$nb = $pdo->query($sql)->fetchColumn();

Autres conseils

Pour votre information: cela a été rapporté comme un bug à plusieurs reprises 1 , < a href = "https://bugs.php.net/bug.php?id=62571" rel = "nofollow"> 2 , 3 sans solution à ce jour (5.3.14). La seule solution est de faire une nouvelle connexion à chaque fois après bifurquer un enfant, et également mis en PDO :: ATTR_PERSISTENT => false

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top