¿Cómo puedo verificar una conexión PDO MySQL para obtener errores antes de ejecutar una consulta?

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

  •  27-10-2019
  •  | 
  •  

Pregunta

Mis guiones se están acumulando bastante con procesos bifurcados en muchas funciones diferentes. Cuando sea pcntl_fork() se llama, todas las conexiones MySQL se pierden. Si ejecuto una consulta en una conexión PDO MySQL, recibo el error "MySQL server has gone away".

El problema es que este error solo aparece en PDO::errorinfo() Después de una ejecución fallida de consulta. Me gustaría poder detectar si el servidor MySQL "se ha ido" antes de intentar ejecutar una consulta. De esa manera podría crear un envoltorio PDO que me haga una nueva conexión en tales situaciones.

¿Algunas ideas?

¿Fue útil?

Solución

Te doy 2 métodos por ejemplo (similar en algunos aspectos):
Ejemplo 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().'. ';
        }
    }
}

Ejemplo 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();

Otros consejos

FYI: Esto se ha informado como un error varias veces 1,2,3 Sin solución hasta ahora (5.3.14). La única solución es hacer una nueva conexión cada vez después de bifurgar a un niño, y también establecer PDO :: Attr_persistent => Falso

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top