Đóng kết nối mysql có quan trọng không?


88

Điều quan trọng là phải đóng hiệu quả kết nối mysql một cách khôn ngoan hay nó tự động đóng sau khi tệp php đã chạy?


Thấy câu hỏi này quá stackoverflow.com/questions/336078/…
alex

Tôi đoán điều tương tự cũng áp dụng cho ftp_close?
doc_id

Đóng kết nối mysql có quan trọng không? vâng, nó cũng giống như destructor trong c ++
jasinth premkumar

Câu trả lời:


89

Từ tài liệu :

Lưu ý: Liên kết đến máy chủ sẽ bị đóng ngay sau khi quá trình thực thi tập lệnh kết thúc, trừ khi nó bị đóng trước đó bằng cách gọi mysql_close () một cách rõ ràng.

Nếu tập lệnh của bạn có một lượng xử lý hợp lý để thực hiện sau khi tìm nạp kết quả và đã truy xuất toàn bộ tập kết quả, bạn chắc chắn nên đóng kết nối. Nếu không, có khả năng máy chủ MySQL sẽ đạt đến giới hạn kết nối khi máy chủ web được sử dụng nhiều. Nếu bạn không thể đóng kết nối MySQL cho đến gần cuối tập lệnh, nó sẽ sạch hơn mặc dù không cần thiết phải làm như vậy rõ ràng.

Tôi không chắc fastcgi ảnh hưởng đến mọi thứ như thế nào. Một trang tuyên bố rằng bản dựng PHP hỗ trợ fastcgi sẽ tạo ra các kết nối liên tục, ngay cả đối với mysql_connect. Điều này mâu thuẫn với tài liệu ở chỗ kết nối bị đóng khi quá trình, chứ không phải tập lệnh, kết thúc. Thay vì thử nghiệm nó, tôi sẽ khuyên bạn nên sử dụng mysql_close (). Trên thực tế, tôi khuyên bạn nên sử dụng PDO , nếu nó có sẵn.


Tôi đoán điều tương tự cũng áp dụng cho ftp_close?
doc_id

4
Điều đó có nghĩa là nếu người dùng đóng trang (ví dụ) sớm (hoặc có một số lỗi) thì kết nối có thể vẫn mở?
Toni Michel Caubet

1
@Toni Michel Caubet "The link to the server will be closed as soon as the execution of the script ends."Khi người dùng đóng trang sớm thì không có vấn đề gì đối với máy chủ PHP. Nó chạy script như mọi khi và kết thúc script như mọi khi. Chỉ người dùng sẽ không thấy kết quả.
arrowman

9

Nó có cốt yếu không? Không nhiều lắm

Nó có được coi là một thực hành tốt để làm theo? Đúng.

Tôi không hiểu tại sao bạn không muốn đóng nó.


6
Vâng, xem xét rằng ngay cả trang hướng dẫn cho mysql_closebiết "Sử dụng mysql_close () thường không cần thiết, vì các liên kết mở không liên tục sẽ tự động bị đóng khi kết thúc quá trình thực thi của tập lệnh." Tôi sẽ không thực sự coi việc không đóng kết nối là một hành vi xấu.
nico

4
"Tôi không hiểu tại sao bạn không muốn đóng nó." Bạn sẽ không muốn đóng nó nếu có bất kỳ cơ hội nào mà bạn có thể cần nó một lần nữa.
Frank Farmer,

1
Nếu bạn sử dụng ajax thì nếu kết nối bị đóng thì mỗi khi bạn cố gắng sử dụng ajax thì kết nối sẽ được mở và đóng lại và điều này sẽ có giá trị hơn là để kết nối mở với máy chủ và khách hàng không quan tâm đến việc kết nối có mở hay không. quan tâm rằng trang web có tốc độ
Robert

nó thực sự có thể rất quan trọng !!! nếu tải máy chủ cao và bạn có nhiều kết nối chưa được đóng kín như đã nói bởi một người khác, điều này có thể dẫn đến máy chủ không phản hồi, vì vậy tôi gọi nó là rất quan trọng!
oliiix

Tốt hơn là nên đóng cửa. Dễ dàng và không có vấn đề.
José Carlos PHP

4

Khi sử dụng một cái gì đó như cgi, hoàn toàn không cần thiết phải đóng các kết nối mysql của bạn vì chúng tự động đóng khi kết thúc quá trình thực thi tập lệnh. Khi sử dụng các công nghệ liên tục như mod_perl và các công nghệ khác, duy trì kết nối của bạn giữa các yêu cầu, thì điều quan trọng là phải theo dõi các kết nối, biến toàn cục, v.v.

Về cơ bản, đối với dữ liệu liên tục, hãy tự dọn dẹp sau. Đối với dữ liệu nhỏ, không liên tục, tất cả sẽ biến mất khi yêu cầu kết thúc. Dù bằng cách nào, phương pháp tốt nhất là luôn đóng các kết nối của bạn.


1
Anh ấy đang nói về PHP, vốn không bền bỉ, vì vậy điều đó không áp dụng.
Sasha Chedygov

2

Được đóng ngay sau khi tập lệnh hoàn tất quá trình thực thi. Trừ khi bạn đã mở một kết nối liên tục. Tốt nhất là bạn nên giải phóng một tài nguyên (một kết nối ở đây) ngay sau khi bạn hoàn thành việc đó. Trừ khi có cơ hội tốt là bạn sẽ cần nó một lần nữa rất sớm trong quá trình thực hiện.

Tổng hợp kết nối hoặc sử dụng các kết nối liên tục (nếu đó là ý của bạn) là một ý tưởng hay nếu bạn đang sử dụng một máy chủ cơ sở dữ liệu duy nhất. Tuy nhiên, nếu có nhiều máy chủ hơn và bạn đang cân bằng tải, điều đó có thể ảnh hưởng đến việc phân phối công việc. Thông thường, một số khách hàng chạy các truy vấn nặng trong khi những người khác chạy các truy vấn nhẹ hơn. Vì vậy, nếu cùng một kết nối được sử dụng hơn n, một số máy chủ sẽ chịu tải nặng trong khi những máy chủ khác sẽ không được sử dụng. Cân nhắc sử dụng ttls nhỏ hơn và kích thước nhóm kết nối thay đổi.


1

Hầu hết các CMS đều đóng kết nối MySQL khi kết thúc yêu cầu, điều này thực sự vô nghĩa, bởi vì PHP sẽ thực hiện điều đó.

Tuy nhiên, nếu bạn có một tập lệnh mà kết nối không còn cần thiết nói ở giữa tập lệnh và sau đó các hoạt động nặng nề khác diễn ra, thì bạn nên đóng kết nối một cách rõ ràng. Điều này sẽ giải phóng một số tài nguyên.

Bây giờ, người ta đã nói nhiều về lợi ích của việc đóng một kết nối, nhưng hầu như không có gì được nói về lợi ích của việc không đóng nó. Về cơ bản, nếu bạn không đóng kết nối ở cuối tập lệnh, thì bạn thực sự đang tiết kiệm một số tài nguyên. Hãy tưởng tượng một ứng dụng web (hoặc bất kỳ ứng dụng nào) nhận được 100 lần xem trang / giây. Vì vậy, mỗi giây, bạn sẽ cần gọi mysqli_close100 lần - có nghĩa là trong mỗi giây, bạn có 100 lần di chuyển không cần thiết đến máy chủ cơ sở dữ liệu để đóng các kết nối đang mở. Từ góc độ hiệu suất, đây là chi phí thuần túy, vì PHP sẽ kiểm tra các kết nối mở khi tập lệnh hoàn tất và sẽ đóng các kết nối đó, và có thể là do mọi thứ diễn ra quá nhanh nên PHP không thấy rằng bạn có đã đóng các kết nối đó và sẽ cố gắng đóng lại.

Lưu ý: câu trả lời ở trên giả định rằng bạn không sử dụng kết nối liên tục (kết nối liên tục không được sử dụng trong bất kỳ CMS chính nào).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.