2013-08-28 82 views
9

tôi đang làm việc trên trang web Magento và tôi nhận được lỗi này:SQLSTATE [HY000]: Lỗi chung: 2006 máy chủ MySQL đã biến mất trên chạy cron công việc Magento

SQLSTATE[HY000]: General error: 2006 MySQL server has gone away on running 
cron job magento 

tôi chỉ nhận được lỗi này đôi khi.

<?php 
class Namespace_Module_Model_Observer 
{ 
    public function importemails(Varien_Event_Observer $observer) 
    { 
    echo "Hi Dear";exit(); 

    /* connect to gmail */ 
    $hostname = '{imap.gmail.com:993/imap/ssl}INBOX'; 
    $username = '[email protected]'; 
    $password = 'mypass'; 

    /* try to connect */ 
    $inbox = imap_open($hostname,$username,$password) 
     or die('Cannot connect to Gmail: ' . imap_last_error()); 

    /* grab emails */ 
    $emails = imap_search($inbox,'ALL'); 

    /* if emails are returned, cycle through each... */ 
    if($emails) { 

     /* begin output var */ 
     $output = ''; 

     /* put the newest emails on top */ 
     rsort($emails); 

     /* for every email... */ 
     foreach($emails as $email_number) { 

     /* get information specific to this email */ 
     $overview = imap_fetch_overview($inbox,$email_number,0); 
     $message = imap_fetchbody($inbox,$email_number,2); 

     /* output the email header information */ 
     $output.= 
      '<div class="toggler '.($overview[0]->seen ? 'read' : 'unread').'">'; 
     $output.= '<span class="subject">'.$overview[0]->subject.'</span> '; 
     $output.= '<span class="from">'.$overview[0]->from.'</span>'; 
     $output.= '<span class="date">on '.$overview[0]->date.'</span>'; 
     $output.= '</div>'; 

     /* output the email body */ 
     $output.= '<div class="body">'.$message.'</div>'; 
     } 
     echo $output; 
    } 

    /* close the connection */ 
    imap_close($inbox); 
    } 
} 

Mã này hoạt động trong vài giờ sau đó lỗi này gây ra lỗi này. Lỗi này có nghĩa là gì?

Trả lời

25

Kết nối DB có thời gian chờ sẽ gây ra lỗi này nếu bạn cố gửi một truy vấn đôi khi sau khi mở kết nối. Kịch bản thường thấy là: kết nối

  • mở DB
  • Fetch một số dữ liệu từ DB
  • Do thứ, ví dụ gửi email (cần có thời gian dài hơn DB kết nối timeout)
  • Query DB sử dụng cùng một kết nối
  • Lỗi: máy chủ MySQL đã đi xa

Vì vậy, - giải pháp là gì? Bạn chỉ có thể tăng thời gian chờ, nhưng điều đó thật xấu và có thể gây ra sự cố khi lưu lượng truy cập đến trang web của bạn tăng lên. Giải pháp tốt nhất là để đóng kết nối DB của bạn và sau đó mở lại nó như thế này: kết nối

  • mở DB
  • Fetch một số dữ liệu từ DB
  • kết nối Đóng DB
  • Do thứ, ví dụ gửi email (cần có thời gian dài hơn thời gian chờ kết nối DB)
  • mở DB mới kết nối
  • Query DB sử dụng cùng một kết nối
  • Đóng DB kết nối

Dưới đây là thêm thông tin: http://dev.mysql.com/doc/refman/5.0/en/gone-away.html

0

Nếu bạn gặp lỗi này với trình thông dịch phpsh. Tôi có thể tạo lại lỗi này với phpsh và một trình bao mới cho trình quản lý học thuyết.

SQLSTATE[HY000]: General error: 2006 MySQL server has gone away 

Với lệnh này trong thông dịch phpsh:

php> $result = $conn->query('select psetid from psetproblems')->fetchAll(); 

Giải thích:

Lỗi này là lỗi timeout MySQL. Hoặc bạn đã chờ quá lâu trong việc tạo kết nối và sau đó thực sự sử dụng nó hoặc bạn đã mắc lỗi với một trong các lệnh của mình và bạn đã hủy kết nối. Giải pháp đơn giản nhất là dừng lại, khởi động lại mọi thứ và không chạy lệnh ném lỗi và thực hiện nhanh chóng. Nó sẽ hoạt động.

Giải pháp

Khởi động lại dịch viên của bạn.Không gửi lỗi và nhanh hơn trong việc phát hành lệnh thông qua trình thông dịch của bạn.

Bạn có thể tăng thời lượng chờ của kết nối MySQL cho PHP. Sau đó, bạn có thể đợi lâu hơn giữa việc tạo kết nối, sau đó sử dụng kết nối.

0

Tôi không có bất kỳ vấn đề thời gian chờ nào.

Tôi đã chuyển dòng fclose (STDERR) từ tệp chính của tôi sang tệp được bao gồm và điều này bắt đầu xảy ra.

SQLSTATE [HY000]: Lỗi chung: 2006 máy chủ MySQL đã đi xa

tôi chuyển dòng trở lại vị trí ban đầu của nó và vấn đề đi đi.

Về cơ bản, đóng STDERR từ tệp được bao gồm dường như có một số hậu quả điên rồ.

0

Bạn cũng có thể xem xét kích thước bảng chỉ mục khi sử dụng tính năng chia sẻ lưu trữ. Nó có thể mất nhiều không gian vì điều đó cũng bạn có thể nhận được "máy chủ mysql biến mất".

0

Tôi đã gặp lỗi này trước đây. Đối với trường hợp của tôi đó là do kích thước cơ sở dữ liệu là quá lớn, hơn 18gb cho dữ liệu 5 năm.

Giải pháp duy nhất làm việc cho tôi là đổ tất cả dữ liệu đó và tạo cơ sở dữ liệu mới.

0

Nếu bạn có bất kỳ hành động nào không hoạt động với Magento DB trong hơn 20 giây (tôi đã gặp chia sẻ lưu trữ với wait_timeout = 20), bạn phải đóng kết nối DB. Magento sẽ tạo kết nối mới trong lần gọi tới DB.

Mage::getSingleton('core/resource')->getConnection('read')->closeConnection();