Come posso controllare una connessione MySQL DOP per gli errori prima che esegue una query?

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

  •  27-10-2019
  •  | 
  •  

Domanda

I miei script sono sempre abbastanza pieno di processi biforcuta in un sacco di funzioni diverse. Ogni volta che si chiama pcntl_fork(), tutte le connessioni MySQL sono persi. Se eseguo una query su una connessione MySQL DOP ottengo l'"MySQL server has gone away" errore.

Il problema è che questo errore mostra solo in PDO::errorinfo() dopo un'esecuzione della query fallito. Mi piacerebbe essere in grado di rilevare se il server MySQL "è andato via" prima si tenta di eseguire una query. In questo modo ho potuto creare una DOP wrapper che rende una nuova connessione per me in queste situazioni.

Tutte le idee?

È stato utile?

Soluzione

Vi do 2 metodi per esempio (simile per certi versi):
Esempio 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().'. ';
        }
    }
}

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

Altri suggerimenti

A proposito: questo e 'stato segnalato come un bug più volte 1 , < a href = "https://bugs.php.net/bug.php?id=62571" rel = "nofollow"> 2 , 3 con nessuna correzione finora (5.3.14). L'unica soluzione è quella di fare una nuova connessione ogni volta dopo che si biforcano un bambino, e anche impostare PDO :: ATTR_PERSISTENT => false

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top