2009-09-23 35 views
11

Tôi gặp sự cố khi sử dụng lớp mysqli trong PHP và tôi không thể tìm thấy câu trả lời ở bất kỳ đâu.PHP mysqli reconnect problem

Trong tập lệnh của tôi, một lớp sẽ tạo kết nối mysqli mà nó sử dụng trong suốt các chức năng của nó. Sau đó, kịch bản này dĩa. Kết nối được sử dụng bởi các trẻ em là tốt, nhưng tôi đang chạy vào vấn đề kết nối được đóng lại (MYSQL Server Has Gone Away) trong phụ huynh khi các em chết.

Trước khi chuyển sang mysqli (chỉ sử dụng mysql), tôi đã gọi mysql_ping để đảm bảo rằng kết nối db đã có trước khi thực hiện truy vấn trong tiến trình cha. Mysqli có một chức năng ping tương tự NHƯNG nó không thực sự kết nối lại nếu kết nối đã biến mất. Tôi đã thử sử dụng mysqli.reconnect = ON thiết lập chung không có may mắn (sử dụng php.ini và ini_set).

Chức năng php mysql_connect cho phép bạn lấy kết nối đã tồn tại, vì vậy nếu tôi đang sử dụng mysql thay vì mysqli, tôi có thể sử dụng lại kết nối đó ngay sau khi quá trình được chia nhỏ. NHƯNG mysqli dường như không có bất kỳ chức năng nào như vậy ...

Điều duy nhất tôi có thể làm là gọi mysqli-> ping() và nếu điều đó trả về false thì hãy kết nối lại với cơ sở dữ liệu trong phụ huynh. Điều này là cực kỳ không hiệu quả, và tôi sẽ tìm ra cách để làm điều đó một cách chính xác với mysqli (và không cần phải kết nối lại thủ công) mà phải thay đổi trở lại mysql ..

Bất cứ đề nghị?

Trả lời

13

Các doc cho mysqli_ping() nói rằng nếu bạn thiết lập các tùy chọn toàn cầu mysqli.reconnect-1 (trong php.ini của bạn) sau đó mysqli_ping() sẽ kết nối lại khi nó phát hiện các kết nối đã biến mất.

+3

Điều đó đã hiệu quả. Tôi đã không nhận ra rằng bạn không thể sử dụng ini_set để sửa đổi biến này, và là thiên tài tôi, tôi đã thêm dòng vào php.ini trước đây, không biết rằng đã có một mysli.reconnect = Tắt dòng tiếp tục xuống tập tin. Nhưng loại bỏ một và chỉ sử dụng mysqli.reconnect làm việc và thực hiện mysqli-> ping() thực hiện giống như mysql_ping. Cảm ơn đã giúp đỡ! –

-1

Sử dụng http://www.php.net/manual/en/mysqli.real-connect.php ... cài đặt lại php và kiểm tra các thiết lập php.ini của bạn

+0

Cài đặt lại php sẽ là một quá mức cần thiết. Tìm php.ini mặc định trên web và kiểm tra xem php.ini của bạn đã thay đổi bao nhiêu. – Phalgun

0

u có thể thử một cái gì đó một chút khác nhau .. thay vì ping .. cố gắng gửi một truy vấn cường độ thấp thực sự đơn giản như "chọn bây giờ () "và xem bạn có nhận được kết quả nào tốt hơn không.

+0

lý do có thể giúp ... mysql thấy u là người dùng đang hoạt động thay vì người chỉ đang nắm giữ kết nối và hogging tài nguyên .. tôi tin rằng có một số cài đặt hết thời gian chờ trong my.ini/my.cnf tác động đến hành vi đó .. nếu bạn có quyền truy cập vào đó u cũng có thể nhìn vào nó. –

0

Bạn không thể sử dụng kết nối liên tục? Ngoài ra, đó là thực sự cần thiết để ngã ba()?

-2

Tôi nghĩ rằng bạn cần phải đặt mysqli.reconnect trong my.cng, đó là cấu hình mysql, thay vì php.ini, tôi không thể quản lý để thay đổi kết nối lại thông qua ini_set, nhưng quản trị viên của tôi đã làm điều đó trong của tôi. cnf.

Vì vậy, chút nhầm lẫn mà người khác đã thực hiện nó trong php.ini ....

+0

Không đúng sự thật. 'my.cnf' chỉ liên quan đến máy chủ MySQL, vì vậy thường sẽ không ảnh hưởng đến một máy khách PHP và' mysqli' chỉ tồn tại trong PHP. [mysqli.reconnect] (http://www.php.net/manual/ vi/mysqli.configuration.php # ini.mysqli.reconnect) * là * một cài đặt cấu hình PHP. – Synchro

1
function IsConnected() { 
    if (empty($this->_connectionID) === FALSE && mysqli_ping($this->_connectionID) === TRUE) { 
     return true; // still have connect 
    } 
    $this->_connectionID = false; 
    return false; // lose connection 
}