Как я могу проверить соединение PDO MySQL на наличие ошибок, прежде чем запустить запрос?

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

  •  27-10-2019
  •  | 
  •  

Вопрос

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

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

Любые идеи?

Это было полезно?

Решение

Я даю вам 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();

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top