2009-06-25 34 views
61

Khi tôi mở một kết nối MySQL trong PHP chỉ với chức năng MySQL tích hợp PHP, tôi thực hiện như sau:kết nối Do SQL mở với PDO trong PHP phải được đóng

$link = mysql_connect($servername, $username, $password); 
mysql_select_db($dbname); 
//queries etcetera 
mysql_close($link); 

Khi tôi mở một kết nối với PDO, nó trông như thế này:

$link = new PDO("mysql:dbname=$dbname;host=$servername",$username,$password); 
//prepare statements, perform queries 

tôi có phải đóng một cách rõ ràng các kết nối như tôi làm với mysql_connect()mysql_close()? Nếu không, làm thế nào để PHP biết khi nào tôi thực hiện xong kết nối của mình?

TIA.

Trả lời

76

Sử dụng $link = null để cho PDO biết rằng nó có thể đóng kết nối.

PHP: PDO Connections & Connection Management

Sau khi kết nối thành công vào cơ sở dữ liệu, một thể hiện của lớp PDO được trả lại cho kịch bản của bạn. Kết nối vẫn hoạt động trong suốt thời gian tồn tại của đối tượng PDO đó. Để đóng kết nối, bạn cần phải hủy bỏ đối tượng bằng cách đảm bảo rằng tất cả các tham chiếu còn lại cho nó bị xóa - bạn làm điều 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.

+1

Cảm ơn! Nhiều đánh giá cao. – benjy

+1

Tôi tự hỏi liệu PDO dtor có đóng kết nối một cách rõ ràng hay không, nó giống như những gì xảy ra khi 'mysql_close()' không được sử dụng ở cuối kịch bản (hoặc trong '__destruct()' của lớp db của bạn) ? Từ hướng dẫn, có vẻ như khi đối tượng PDO bị hủy, kết nối cũng bị đóng. Quan trọng vì điều này: http://stackoverflow.com/a/2960656/372654. Có vẻ như vậy từ mã nguồn PDO nhưng ... –

+5

WOuldn't một 'unset()' đối tượng PDO thay vì đặt nó thành NULL? Tôi thực sự muốn một số làm rõ về điều này! –

11

Khi tập lệnh PHP kết thúc thi hành, tất cả các kết nối sẽ bị đóng. Ngoài ra, bạn không phải đóng kết nối rõ ràng với mysql_close().

0

http://uk3.php.net/pdo

Từ những gì tôi thu thập tôi không thể nhìn thấy anyway để đóng nó trong cuốn hướng dẫn php, và ví dụ về các kịch bản tôi nhanh chóng nhìn không bao giờ đóng kết nối trong anyway từ những gì tôi có thể nhìn thấy.

5

Bạn cũng có thể giới hạn kết nối của mình với các chức năng cục bộ. Bằng cách đó, kết nối được đóng lại ngay sau khi chức năng được hoàn thành.

11

PDO không tự cung cấp một chức năng như vậy. Các kết nối thông qua PDO được quản lý gián tiếp thông qua các đối tượng PDO refcount trong PHP.

Nhưng đôi khi bạn vẫn muốn đóng kết nối, bất kể số lần truy cập là bao nhiêu. Hoặc là vì bạn không thể kiểm soát nó, cần nó cho mục đích thử nghiệm hoặc tương tự.

Bạn có thể đóng kết nối Mysql bằng PDO bằng cách chạy truy vấn SQL.Mỗi người sử dụng có khả năng kết nối đến máy chủ Mysql có thể KILL ít nhất thread riêng của mình:

/* 
* Close Mysql Connection (PDO) 
*/ 

$pdo_mysql_close = function (PDO $connection) { 

    $query = 'SHOW PROCESSLIST -- ' . uniqid('pdo_mysql_close ', 1); 
    $list = $connection->query($query)->fetchAll(PDO::FETCH_ASSOC); 
    foreach ($list as $thread) { 
     if ($thread['Info'] === $query) { 
      return $connection->query('KILL ' . $thread['Id']); 
     } 
    } 
    return false; 
}; 

$pdo_mysql_close($conn); 

liên quan Mysql Tài liệu:

liên quan Câu hỏi về Stackoverflow:

.210
1

Vâng thấy như $link cho PDO được gán một đối tượng, PHP sẽ thiết lập đó là null như sớm như kịch bản chạy để nó không còn là một đối tượng. Do đó bạn chỉ có thể làm:

$link = new PDO("mysql:dbname=$dbname;host=$servername",$username,$password); 

//prepare statements, perform queries 

$link = null; 
Các vấn đề liên quan