2011-07-26 8 views
6

Moje skrypty są coraz bardziej podziurawione za pomocą rozwidlonych procesów w wielu różnych funkcjach. Po wywołaniu pcntl_fork() wszystkie połączenia MySQL są tracone. Jeśli uruchomię zapytanie na połączeniu MySQL PDO, otrzymam komunikat o błędzie "MySQL server has gone away". Ten problem pojawia się tylko w PDO::errorinfo() po nieudanym uruchomieniu zapytania. Chciałbym móc wykryć, czy serwer MySQL "odszedł", zanim spróbuję uruchomić zapytanie. W ten sposób mogłem stworzyć opakowanie PDO, które tworzy dla mnie nowe połączenie w takich sytuacjach.Jak mogę sprawdzić połączenie MySQL PDO pod kątem błędów PRZED uruchomieniem zapytania?

Wszelkie pomysły?

+0

Co naprawić, powodując ten błąd? Musisz wyleczyć chorobę, a nie tylko ukryć objawy. – zerkms

+0

Czy przyczyną błędu nie jest rozwidlenie? Czy to nie oznacza, że ​​** muszę ** utworzyć nowe połączenie za każdym razem, gdy się rozwidni? – Hubro

+1

Rozwidlenie jest najprawdopodobniej przyczyną problemu. Najlepiej najpierw rozwidlić, a następnie otworzyć połączenie. Jeśli nie jest to możliwe, ten komentarz w dokumentacji może pomóc: http://php.net/manual/en/function.pcntl-fork.php#70721 Zobacz także [Serwer MySQL odszedł] (http: // dev .mysql.com/doc/refman/5.5/pl/gone-away.html) - w szczególności wiersz o rozwidleniu. – Mike

Odpowiedz

2

dam ci 2 metody na przykładzie (podobna pod pewnymi względami):
Przykład 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().'. '; 
     } 
    } 
} 

Przykład 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

FYI: ten został zgłoszony jako błąd kilku razy 1, 2, 3 bez żadnego rozwiązania do tej pory (5.3.14). Jedynym rozwiązaniem jest zrobienie nowego połączenia za każdym razem po rozwidleniu dziecka, a także ustawienie PDO :: ATTR_PERSISTENT => false

Powiązane problemy