2017-06-27 15 views
5

tôi tiếp tục nhận được lỗi sau từ mã của tôi:kết nối PDO timed out trong API, php-fpm khởi động lại giải quyết nó

Cơ sở dữ liệu kết nối thất bại: PDO :: __ construct(): gửi 12 byte thất bại với errno = 110 Kết nối hết thời gian

Lỗi này liên tục xảy ra trên api. Nếu api đó tiếp tục được gọi là rất nhiều trong ngày điều này không xảy ra. Chỉ khi api không được sử dụng trong một thời gian.

Tôi có thể giải quyết vấn đề này bằng cách thực hiện khởi động lại/tải lại php-fpm, nhưng đây không phải là giải pháp.

Có ai biết cách giải quyết vấn đề này không?

--EDIT--

Đây là mã để kết nối với cơ sở dữ liệu:

public function connectDatabase($allow_persistent = true) 
{ 
    $this->db = null; 

    $this->readINI(); 

    $pdo_attr = [ 
     PDO::ATTR_PERSISTENT => $allow_persistent, 
     PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8;", 
     PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true, 
    ]; 

    $this->db = new PDO("mysql:host=" . $this->db_data_dbhost . ";dbname=" . $this->db_data_dbname . ";charset=utf8", $this->db_data_username, $this->db_data_password, $pdo_attr); 

    $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 

Để itterate một số chi tiết, điều này được sử dụng trên hai của API vào lúc này.

  • Một luôn được sử dụng bởi khách hàng và không bao giờ gặp vấn đề này
  • Thứ hai không được sử dụng bởi rất nhiều khách hàng chưa nhìn thấy như thế này vẫn đang được phát triển, nó chỉ với một vài khách hàng cho mục đích thử nghiệm. Chúng tôi cố gắng để đẩy một ứng dụng đến appstore nhưng nó bị bắn hạ bởi vấn đề này. API này cuối cùng sẽ chạy vào lỗi như được mô tả ở trên và sẽ không khôi phục từ trạng thái này mà không cần khởi động lại/tải lại dịch vụ php-fpm.
+0

bạn có đang sử dụng kết nối liên tục không? – Federkun

+0

@Federkun Tôi đã thêm mã cho kết nối vào cơ sở dữ liệu, vì vậy có nếu bạn làm theo mã – Wouter

+0

Chỉ cần không, http://php.net/manual/en/features.persistent-connections.php – Federkun

Trả lời

2

Sử dụng kết nối liên tục không tốt (see why), nhưng vẫn còn, để giải quyết điều này bạn có thể muốn tăng thời gian chờ kết nối MySQL.

Để đạt được điều này, hãy xem tham số wait_timeout cho my.ini.

p.s. Ngoài ra, bạn có thể bắt lỗi này và chỉ cần kết nối lại với cơ sở dữ liệu.

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