2013-08-16 85 views
81

Chỉ là một câu hỏi khá đơn giản liên quan đến PDO so với MySQLi.Kết nối đóng PDO

Với MySQLi, để đóng kết nối bạn có thể làm:

$this->connection->close(); 

Tuy nhiên với PDO nó nói bạn mở các kết nối sử dụng:

$this->connection = new PDO(); 

nhưng để đóng kết nối bạn đặt nó vào null .

$this->connection = null; 

Điều này có đúng và điều này thực sự sẽ miễn phí kết nối PDO? (Tôi biết nó như nó được thiết lập để null.) Tôi có nghĩa là với MySQLi bạn phải gọi một chức năng (close) để đóng kết nối. PDO có dễ dàng như = null để ngắt kết nối không? Hoặc có chức năng đóng kết nối không?

+11

lý do tôi đang hỏi là tôi không chắc chắn nếu tôi đã đóng kết nối đúng cách. nhưng không thực sự chỉ hấp dẫn –

+0

Bạn có thực sự cần phải đóng kết nối của mình không? –

+0

Mất bao lâu "lâu hơn mức cần thiết"? –

Trả lời

98

Theo tài liệu bạn đúng (http://php.net/manual/en/pdo.connections.php):

Kết nối vẫn tích cực cho cuộc đời của đối tượng PDO. Để đóng kết nối, bạn cần phải phá hủy đối tượng bằng cách đảm bảo rằng tất cả các tham chiếu còn lại bị xóa - bạn thực hiện việc này bằng cách gán NULL cho biến chứa đối tượng. Nếu bạn không làm điều này một cách rõ ràng, PHP sẽ tự động đóng kết nối khi tập lệnh của bạn kết thúc.

Lưu ý rằng nếu bạn khởi tạo đối tượng PDO là kết nối liên tục, nó sẽ không tự động đóng kết nối.

+3

Nếu tôi có một quy trình không kết thúc thì sao? ví dụ. websocket. Có cách nào để không sử dụng kết nối liên tục không? –

+0

Lưu ý rằng trục trặc mạng có thể ngắt kết nối bạn. –

+0

Đối với các kết nối liên tục trong tập lệnh chạy trong một thời gian dài, bạn có thể cố ý (hoặc vô tình) có các kết nối bị giết với thời gian chờ (ví dụ: trong my.ini) hoặc vì một số lý do khác. Khi kết nối hoặc chạy một truy vấn, bắt bất kỳ lỗi nào và nếu đó là "MySQL đã biến mất", hãy thử kết nối lại hoặc chạy truy vấn lần thứ hai. –

22
$conn=new PDO("mysql:host=$host;dbname=$dbname",$user,$pass); 
    // If this is your connection then you have to assign null 
    // to your connection variable as follows: 
$conn=null; 
    // By this way you can close connection in PDO. 
+8

IMHO Tôi nghĩ rằng đó là một mô hình rất xấu, đặc biệt là khi một nhà phát triển có thể lưu trữ một số bản sao của tài liệu tham khảo pdo. $ a = new PDO (...); $ b = $ a; $ a = null; Ở đó, đối tượng PDO của bạn sẽ vẫn mở vĩnh viễn (trong chương trình php giống như daemon). Điều này đặc biệt đúng khi tham chiếu PDO di chuyển qua các hàm và thuộc tính đối tượng, và bạn không bao giờ chắc chắn bỏ qua tất cả chúng. – Gabriel

+16

Cần có phương thức close -> trên PDO. – Gabriel

+2

Một lý do khác để không thích PDO. –

0

Tôi đã tạo một lớp dẫn xuất để có hướng dẫn tự ghi tài liệu thay vì "$ conn = null;".

class CMyPDO extends PDO { 
    public function __construct($dsn, $username = null, $password = null, array $options = null) { 
     parent::__construct($dsn, $username, $password, $options); 
    } 

    static function getNewConnection() { 
     $conn=null; 
     try { 
      $conn = new CMyPDO("mysql:host=$host;dbname=$dbname",$user,$pass); 
     } 
     catch (PDOException $exc) { 
      echo $exc->getMessage(); 
     } 
     return $conn; 
    } 

    static function closeConnection(&$conn) { 
     $conn=null; 
    } 
} 

Vì vậy, tôi có thể gọi mã của tôi giữa:

$conn=CMyPDO::getNewConnection(); 
// my code 
CMyPDO::closeConnection($conn); 
+0

Bạn có thể làm cho phương thức CMyPDO :: __ construct() riêng và sử dụng mẫu đơn ở đó .. –

+0

Vâng, nó có khả năng. Bạn cũng cần gán thông tin kết nối bằng một phương thức khác nếu bạn sử dụng nhiều cơ sở dữ liệu tại một thời điểm. Sự khác biệt là tối thiểu, chỉ cần bạn có hướng dẫn ít hơn để gọi phương pháp dụ. – Fil

+0

@AdityaHajare Bạn không thể tạo một phương thức công khai của một siêu lớp riêng tư trong một lớp con .. – nickdnk

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