Php mysql kết nối liên tục

Điều này thực hiện chính xác những gì câu hỏi yêu cầu và hơn thế nữa. Tôi sẽ không đi sâu vào chi tiết về những gì tôi có thể tìm hiểu về vấn đề này nhưng sẽ đề cập rằng đó không phải là một giải pháp khả thi vì nó không minh bạch. Có nghĩa là dòng chảy như sau

PHP -> Queries -> SQL Relay Extension -> SQL Relay -> Externally hosted MySQL

Vì vậy, điều này sẽ liên quan đến việc viết lại tất cả mã của chúng tôi từ mysql sang sql relay. Không phải là một lựa chọn trong trường hợp của chúng tôi

Tất cả những gì đang được nói, nếu ai đó đang lên kế hoạch cho một dự án quy mô lớn mới yêu cầu bất kỳ tính năng nào trong số vô số tính năng mà SQL Relay có, thì điều đó nghe có vẻ hay

Proxy Mysql

http. //làm giả. mysql. com/wiki/MySQL_Proxy

Đây là giải pháp cuối cùng chúng tôi đã sử dụng

Chìa khóa để làm điều này làm những gì chúng tôi muốn nó làm là tập lệnh LUA tổng hợp cho proxy mysql

Phần mở rộng LUA này có thể được tìm thấy tại

https. //github. com/cwarden/mysql-proxy/blob/315ab806bb95b8223f5afd3d238eff2a40af03d8/lib/ro-pooling. lúa

Không đi vào quá nhiều chi tiết, đây là một số thống kê cơ bản. Xin lưu ý rằng, điều này được thử nghiệm ở thời gian sử dụng THẤP

[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
   6433   38598  572537

Sau khi chuyển sang mysql-proxy và để mọi thứ ổn định

[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
     32     192    2848

Như bạn có thể thấy rõ, các cổng TIME_WAIT tới mysql đã giảm xuống gần như không có

Trên thực tế, các kết nối hiện đang tồn tại mà KHÔNG sử dụng mysql_pconnect/mysqli_connect(. P. tên máy chủ. )

Đáng nói là dường như có một vài cài đặt có thể định cấu hình ở gần đầu tập lệnh lua của pooler

min_idle_connections cục bộ

max_idle_connections cục bộ

Chúng dường như khá tự giải thích. Ngoại trừ việc. Có vẻ như mỗi tên người dùng (và mật khẩu? chưa được kiểm tra. rất có thể không tho. ) kết hợp tạo tập hợp các kết nối liên tục của riêng nó

Vì vậy, hãy nhân max_idle_connections với số lượng người dùng mysql duy nhất sẽ kết nối với cơ sở dữ liệu. Và điều đó sẽ cho bạn ý tưởng về việc bạn sẽ có bao nhiêu kết nối nhàn rỗi

Vì vậy, hãy để tôi nhắc lại để lời giới thiệu nhỏ này đánh vào một số từ khóa cho những người tìm kiếm qua google

Khi sử dụng PHP có thể có các kết nối mysql liên tục mà KHÔNG CÓ mysql_pconnect không?

Có, điều này có thể được thực hiện thông qua SQL Relay nếu bạn không ngại xây dựng lại hầu hết mã của mình để chuyển các truy vấn của bạn thông qua tiện ích mở rộng của chúng HOẶC sử dụng mysql-proxy một cách minh bạch với ro-pooling. kịch bản lua

Trong PDO, kết nối tới cơ sở dữ liệu có thể liên tục hoặc không liên tục. Kết nối liên tục thực hiện bằng cách sử dụng thuộc tính PDO. ATTR_PERSISTENT. Các kết nối liên tục không đóng khi tập lệnh kết thúc, nhưng chúng được lưu vào bộ đệm ẩn và có thể được sử dụng lại khi một kết nối liên tục được yêu cầu giống hệt với kết nối hiện có.  

Khi một kết nối được yêu cầu, PHP sẽ kiểm tra xem kết nối đó đã tồn tại hay chưa, nếu tồn tại thì nó được sử dụng để thực thi. Nó ảnh hưởng đến thời gian thực hiện các yêu cầu, nó nhanh hơn kết nối không liên tục.  

Nhưng cũng có một số nhược điểm của kết nối liên tục. Theo tài liệu hướng dẫn sử dụng php

Nếu tập lệnh vì bất kỳ lý do gì không thể giải phóng khóa, thì các tập lệnh tiếp theo sử dụng cùng một kết nối sẽ chặn vô thời hạn và có thể yêu cầu bạn khởi động lại máy chủ http hoặc máy chủ cơ sở dữ liệu. Một điều nữa là khi sử dụng các giao dịch, một khối giao dịch cũng sẽ chuyển sang tập lệnh tiếp theo sử dụng kết nối đó nếu việc thực thi tập lệnh kết thúc trước khi khối giao dịch thực hiện

Cách tiếp cận 1. Ví dụ về kết nối liên tục. Chúng tôi đã thảo luận rằng các kết nối liên tục không bị đóng ở cuối tập lệnh, nhưng được lưu vào bộ nhớ cache và được sử dụng lại khi một tập lệnh khác yêu cầu kết nối bằng cùng thông tin đăng nhập. Do kết nối liên tục được lưu vào bộ nhớ đệm nên sẽ có lợi khi tránh được chi phí thiết lập kết nối mới. Không cần thiết lập kết nối mỗi lần với cơ sở dữ liệu và kết quả là tối ưu hóa truy vấn nhanh.  

PHP




$dbh =new PDO(__'mysql:host=localhost;dbname=test',

[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
   6433   38598  572537
0______11____9$dbh0,$dbh2$dbh3

$dbh4$dbh5

$dbh6

$dbh7

Cách tiếp cận 2. Ví dụ về kết nối không liên tục. Với kết nối liên tục thành công tới cơ sở dữ liệu, một thể hiện của đối tượng của lớp PDO được trả về tập lệnh của bạn. Đó là lý do tại sao kết nối với đối tượng PDO vẫn hoạt động trong thời gian dài. Nếu bạn muốn đóng kết nối này, bạn cần xóa các tham chiếu đến đối tượng và hủy nó. Để làm điều này, bạn muốn gán giá trị null cho đối tượng. Nếu bạn không muốn thực hiện bất kỳ thay đổi nào, kết nối sẽ đóng khi tập lệnh của bạn tự động kết thúc

PHP




$dbh =new PDO(__'mysql:host=localhost;dbname=test',

[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
   6433   38598  572537
0____11____9$dbh0=9

new0

new1 =$dbhnew4new5=9

 

new7

new1 new9

$dbh new9

$dbh7

Ưu điểm của kết nối liên tục

  • Các kết nối không đóng khi tập lệnh kết thúc tôi. e. không cần thiết lập lại kết nối.  
  • Nếu kết nối giống hệt nhau thì yêu cầu sẽ thực thi nhanh hơn kết nối không liên tục.  
  • Kết nối liên tục tốn nhiều thời gian và an toàn.  

Nhược điểm của kết nối liên tục. Trong PHP, các kết nối liên tục đang có một số hạn chế chính như sau

  1. Các kết nối liên tục có thể xảy ra bế tắc trên toàn máy chủ và cũng có lỗi cơ sở dữ liệu trong quá trình tạo trang. Nó cũng ảnh hưởng đến các giao dịch, khóa bảng, bảng tạm thời, biến phiên, v.v. các tính năng của MySQL đang gặp nguy hiểm
  2. Các kết nối liên tục có thể đạt đến giới hạn vì chúng chiếm hàng trăm ổ cắm và luồng MySQL
  3. Khi vì một lý do nào đó, kết nối hoặc tập lệnh bị chết ở giữa một giao dịch, có thể xảy ra tình trạng khóa bảng cho đến khi bộ đếm thời gian bế tắc khởi động, vì bộ đếm thời gian khóa chết có thể hủy tất cả các yêu cầu mới nhất thay vì các yêu cầu cũ hơn
  4. Giả sử có một nhóm máy chủ web và một trong số đó là máy chủ web chậm có bản sao lưu và sử dụng một số kết nối liên tục, sau đó các kết nối đó không thể được sử dụng bởi các máy chủ khác và không thể hoàn thành yêu cầu của họ.  

Sự kết luận. Đây là một số nhược điểm của kết nối liên tục. Nhưng việc tắt kết nối liên tục có thể ảnh hưởng đến thời gian thực hiện yêu cầu.  

Kết nối PDO trong PHP là gì?

Để chuẩn hóa và hợp lý hóa các phương pháp phát triển, PHP đã giới thiệu Đối tượng dữ liệu PHP (PDO) trong PHP 5. 1. Các đối tượng này được sử dụng để thiết lập các kết nối cơ sở dữ liệu PDO. PDO là lớp truy cập cơ sở dữ liệu cung cấp giao diện nhanh và nhất quán để truy cập và quản lý cơ sở dữ liệu trong các ứng dụng PHP .

Hàm mysql_pconnect() là gì?

Thiết lập kết nối liên tục đến máy chủ MySQL . mysql_pconnect() hoạt động rất giống mysql_connect() với hai điểm khác biệt chính. Đầu tiên, khi kết nối, trước tiên chức năng sẽ cố gắng tìm một liên kết (liên tục) đã được mở với cùng một máy chủ, tên người dùng và mật khẩu.

MySQLi hay PDO cái nào tốt hơn?

Cả MySQLi và PDO đều có những ưu điểm riêng. PDO sẽ hoạt động trên 12 hệ thống cơ sở dữ liệu khác nhau, trong khi MySQLi sẽ chỉ hoạt động với cơ sở dữ liệu MySQL . Vì vậy, nếu bạn phải chuyển dự án của mình sang sử dụng cơ sở dữ liệu khác, PDO sẽ giúp quá trình này trở nên dễ dàng. Bạn chỉ phải thay đổi chuỗi kết nối và một vài truy vấn.

Sự khác biệt giữa Mysql_connect và mysql_pconnect là gì?

Mysql_connect() mở kết nối mới tới cơ sở dữ liệu trong khi mysql_pconnect() mở kết nối liên tục tới cơ sở dữ liệu . Điều này có nghĩa là mỗi khi trang được tải, mysql_pconnect() không mở cơ sở dữ liệu. Mysql_close() không thể được sử dụng để đóng kết nối liên tục.