Wie kann ich eine PDO -MySQL -Verbindung auf Fehler überprüfen, bevor ich eine Abfrage ausführe?
Frage
Meine Skripte werden in vielen verschiedenen Funktionen mit gegabelten Prozessen ziemlich durchsetzt. Wann immer pcntl_fork()
Es wird genannt, alle MySQL -Verbindungen gehen verloren. Wenn ich eine Abfrage auf einer PDO MySQL -Verbindung ausführe, erhalte ich den Fehler "MySQL server has gone away"
.
Das Problem ist, dass dieser Fehler nur in angezeigt wird PDO::errorinfo()
Nach einer fehlgeschlagenen Abfrageausführung. Ich möchte erkennen können, ob der MySQL -Server "verschwunden ist", bevor ich versuche, eine Abfrage auszuführen. Auf diese Weise konnte ich eine PDO -Wrapper erstellen, die in solchen Situationen eine neue Verbindung für mich herstellt.
Irgendwelche Ideen?
Lösung
Ich gebe Ihnen 2 Methoden mit Beispiel (in gewisser Weise ähnlich):
Beispiel 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().'. ';
}
}
}
Beispiel 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();