2011-07-26 29 views
6

Các tập lệnh của tôi trở nên khá khó khăn với các quy trình được chia nhỏ trong nhiều chức năng khác nhau. Bất cứ khi nào pcntl_fork() được gọi, tất cả các kết nối MySQL đều bị mất. Nếu tôi chạy truy vấn trên kết nối PDO MySQL, tôi gặp lỗi "MySQL server has gone away".Làm cách nào để kiểm tra kết nối PDO MySQL bị lỗi TRƯỚC KHI tôi chạy truy vấn?

Vấn đề là lỗi này chỉ hiển thị trong PDO::errorinfo() sau khi thực hiện truy vấn không thành công. Tôi muốn có thể phát hiện nếu máy chủ MySQL "đã biến mất" trước khi tôi thử chạy truy vấn. Bằng cách đó tôi có thể tạo ra một wrapper PDO tạo ra một kết nối mới cho tôi trong những tình huống như vậy.

Bất kỳ ý tưởng nào?

+0

Điều gì về việc khắc phục sự cố gây ra lỗi đó? Bạn cần phải chữa bệnh, không chỉ che giấu các triệu chứng. – zerkms

+0

Không phải là nguyên nhân gây ra lỗi không? Điều đó không có nghĩa là tôi ** có ** để tạo một kết nối mới mỗi khi tôi ngã ba? – Hubro

+1

Rèn là rất có thể là nguyên nhân của vấn đề. Lý tưởng nhất, bạn nên ngã ba đầu tiên và sau đó mở một kết nối. Nếu điều đó là không thể, bình luận này trong tài liệu có thể giúp: http://php.net/manual/en/function.pcntl-fork.php#70721 Xem thêm [MySQL server đã biến mất] (http: // dev .mysql.com/doc/refman/5.5/en/gone-away.html) - cụ thể là dòng giới thiệu. – Mike

Trả lời

2

tôi cung cấp cho bạn 2 phương pháp bằng ví dụ (tương tự như trong một số cách):
Ví dụ 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().'. '; 
     } 
    } 
} 

Ví dụ 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: điều này đã được báo cáo là lỗi nhiều lần 1, 2, 3 mà không sửa chữa cho đến nay (5.3.14). Giải pháp duy nhất là thực hiện kết nối mới mỗi lần sau khi giả mạo một đứa trẻ và cũng đặt PDO :: ATTR_PERSISTENT => false

Các vấn đề liên quan