Как я могу проверить соединение PDO с MySQL на наличие ошибок ПЕРЕД выполнением запроса?


Мои сценарии становятся довольно запутанными с разветвленными процессами во множестве различных функций. Всякий раз, когда вызывается pcntl_fork(), все соединения MySQL теряются. Если я выполняю запрос по подключению PDO MySQL, я получаю сообщение об ошибке "MySQL server has gone away".

Проблема в том, что эта ошибка появляется только в PDO::errorinfo() после неудачного выполнения запроса. Я хотел бы иметь возможность определить, "исчез" ли сервер MySQL, прежде чем пытаться выполнить запрос. Таким образом, я мог бы создать оболочку PDO, которая установит для меня новое соединение в таких ситуациях.

Есть идеи?

Author: hakre, 2011-07-26

2 answers

Я приведу вам 2 метода на примере (в чем-то похожие):
Пример 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().'. ';
        }
    }
}

Пример 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();
 2
Author: Ka., 2011-07-31 09:30:54

К вашему сведению: об этом несколько раз сообщалось как об ошибке 1,2,3 пока без исправления (5.3.14). Единственное решение - каждый раз устанавливать новое соединение после разветвления дочернего элемента, а также устанавливать PDO::ATTR_PERSISTENT=>false

 2
Author: sivann, 2012-07-16 20:27:13