2014-07-23 36 views
5

Tôi đã đọc mysqli giới thiệu kết nối tổng hợp không có sẵn trong mysql. http://php.net/manual/en/mysqli.quickstart.connections.phpKết nối tổng hợp vs kết nối liên tục mysqli

Tôi đã đọc this question giải thích sự khác biệt giữa kết nối tổng hợp và kết nối liên tục.

Trong mysqli documentation for Persistent connection họ đã viết rằng:

Nếu một kết nối liên tục không sử dụng trong một sự kết hợp nhất định của máy chủ, username, password, ổ cắm, cảng và cơ sở dữ liệu mặc định không thể được tìm thấy trong hồ bơi kết nối , sau đó mysqli sẽ mở một kết nối mới.

Vì vậy, mysqli có sử dụng kết nối tổng hợp cho các kết nối liên tục không?

Nếu có, thì sự khác nhau giữa kết nối tổng hợp và kết nối liên tục trong mysqli là gì?

Nếu không, thì mysqli thực hiện tra cứu đối tượng kết nối cho kết nối liên tục như thế nào?

Trả lời

1

trong libmysql18, sẽ tìm bất kỳ mysql mặc định hiện tại nào sock/port và kiểm tra bằng thông tin xác thực. nếu không tìm thấy, hàm C++ clone() được gọi, tạo đối tượng kết nối mới (Tài nguyên). trong một số trường hợp, điều này có thể dẫn đến tràn ngăn xếp. Tôi không quen với cách nó hoạt động trong mysqlnd (trình điều khiển gốc). có thể ai đó khác. nếu bạn muốn biết thêm thông tin về cách hoạt động, hãy cài đặt phiên bản của gói facebook HHVM-debug và cố gắng chuyển kết nối qua toàn cầu trong nhiều hàm lồng nhau. điều này có thể kích hoạt tràn ngăn xếp theo HHVM, sẽ hiển thị cho bạn mọi chức năng được gọi trước khi ngoại lệ lên đến điểm đó.

+0

Cảm ơn bạn đã phát lại. Tôi đang tìm mysqli và php không phải để hack. – Dhruv

+0

@Dhruv vâng, tôi biết. có hai trình điều khiển khác nhau php sử dụng để kết nối với mysql. một là mysqlnd, cái kia là libmysql. trình điều khiển bạn đang sử dụng phụ thuộc vào hệ điều hành và cài đặt của bạn. tôi đã trả lời câu hỏi của bạn về cách nó thực hiện tra cứu đối tượng kết nối. – r3wt

2

Trên thực tế điều kiện kết nối tổng hợpkết nối liên tục tham khảo những điều tương tự trong trường hợp mysqli trong PHP.

kết nối liên tục trong trường hợp này đề cập đến kết nối MySQL mở cửa từ PHP kịch bản mà vẫn mở sau khi kịch bản đã hoàn tất thi công, được sử dụng lại trong một số hành quyết sau.

Kết nối tổng hợp có nghĩa là có một nhóm kết nối liên tục được duy trì bởi PHP. Một kết nối nhàn rỗi từ nhóm này được cung cấp cho tập lệnh PHP muốn kết nối với MySQL và quay trở lại nhóm khi kịch bản kết thúc.

Bạn có thể thắc mắc tại sao chúng ta lại cần kết nối MySQL, tại sao chúng ta không chỉ sử dụng một kết nối liên tục cho tất cả các kịch bản?

Có hai lý do cho việc này:

  • PHP tạo ra một hồ bơi của các kết nối MySQL dựa trên host/port/username/password sử dụng.Nếu một tập lệnh muốn kết nối với MySQL với một số kết hợp host/port/username/password, các tìm kiếm PHP cho kết nối liên tục không hoạt động có cùng giá trị. Nếu không tìm thấy, thì kết nối liên tục mới sẽ được tạo với kết hợp host/port/username/password này. Vì vậy, chúng tôi cần ít nhất là nhiều kết nối liên tục khác nhau vì có các giá trị host/port/username/password khác nhau được tất cả các tập lệnh sử dụng.
  • Bạn không thể thực thi hai lệnh SQL trên một kết nối MySQL cùng một lúc. Điều này có thể xảy ra khi hai tập lệnh PHP đang thực thi đồng thời. Khi hai kịch bản muốn giao tiếp với MySQL cùng một lúc, hai kết nối MySQL liên tục được tạo ra. Số lượng kết nối liên tục trong nhóm bằng với số lượng tập lệnh PHP song song tối đa được thực hiện gần đây nhất hoặc bằng giới hạn trên được đặt trong php.ini.

Lưu ý quan trọng:

hồ kết nối MySQL (và bất kỳ hồ kết nối khác) có thể chỉ tồn tại nếu PHP được thực hiện như một máy chủ web Plugin. Các hồ bơi không hoạt động khi nó hoạt động ở chế độ fast-cgi hoặc theo bất kỳ cách nào khác khi PHP thực thi chấm dứt sau khi thực thi tập lệnh.

Chỉnh sửa: Kết nối MySQL gộp có thể được sử dụng ở chế độ nhanh cgi của PHP nếu máy chủ web được định cấu hình để sử dụng lại một quy trình PHP nhanh cgi cho nhiều yêu cầu. Nếu quá trình fast-cgi PHP được cấu hình để thoát sau khi phục vụ một yêu cầu thì tất cả các kết nối MySQL của nó đều bị đóng.

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