2012-07-03 23 views
12

Tôi hỏi điều này ở đây vì tôi nghĩ rằng nó không chỉ áp dụng cho EasyPHP.PHP để EasyPHP MySQL server 1 giây kết nối chậm trễ

Tôi hiện đang sử dụng EasyPHP làm máy chủ phát triển WAMP của mình để tôi có thể tạo các ứng dụng web. Vấn đề là, khi tôi nhận được đối tượng mysqli để kết nối với cơ sở dữ liệu phải mất 1 giây. Chạy cùng một truy vấn trên các kết quả lưu trữ được chia sẻ với tốc độ nhanh hơn 200 lần. Đây có phải là điều tôi nên lo lắng không? Về khả năng mở rộng hoặc di chuyển ứng dụng của tôi sang một máy chủ khác, bạn có nên dành thời gian để xem vấn đề là gì không? Tôi chỉ giả định rằng có lẽ EasyPHP chậm. Không phải là một chính, chỉ là một cái gì đó đánh tôi như là thú vị.

Trả lời

45

Nếu bạn gặp sự cố này và sử dụng phiên bản Windows trước Windows 7, điều này có lẽ không phải là câu trả lời cho vấn đề của bạn.

Tại sao điều này xảy ra?

Nguyên nhân của sự cố này là IPv4 so với IPv6.

Khi bạn sử dụng tên máy chủ thay vì địa chỉ IP, trước tiên máy khách MySQL chạy tra cứu máy chủ AAAA (IPv6) và thử địa chỉ này trước nếu nó giải quyết thành công tên thành địa chỉ IPv6. Nếu một trong hai bước thất bại (tên độ phân giải hoặc kết nối) nó sẽ dự phòng cho IPv4, chạy một tra cứu A và thử máy chủ này thay thế.

Điều này có nghĩa trong thực tế là nếu tra cứu IPv6 localhost là thành công nhưng MySQL không bị ràng buộc vào loopback IPv6, bạn sẽ cần phải chờ đợi cho chu kỳ thời gian chờ một kết nối (rõ ràng trên máy tính của OP này là 1 giây) trước khi dự phòng IPv4 xảy ra và kết nối thành công.

Đây không phải là vấn đề trước Windows 7, vì độ phân giải localhost được thực hiện qua tệp máy chủ và được định cấu hình trước chỉ với 127.0.0.1 - không đi kèm với đối tác IPv6 ::1.

Vì Windows 7, tuy nhiên, độ phân giải localhost được tích hợp vào trình phân giải DNS, vì các lý do được nêu rõ here. Điều này có nghĩa là việc tra cứu IPv6 sẽ thành công - nhưng MySQL không bị ràng buộc với địa chỉ IPv6 đó, do đó kết nối sẽ thất bại và bạn sẽ thấy sự chậm trễ được nêu trong câu hỏi này.

Thật tuyệt. Chỉ cần cho tôi biết làm thế nào để sửa nó!

Bạn có một vài tùy chọn.Nhìn xung quanh internet, "giải pháp" chung dường như sử dụng địa chỉ IP một cách rõ ràng thay vì tên, nhưng có một vài lý do không làm điều này, cả hai tính di động liên quan, cả hai đều không quan trọng:

  • Nếu bạn di chuyển tập lệnh của mình sang một máy khác mà chỉ hỗ trợ IPv6, tập lệnh của bạn sẽ không hoạt động nữa.

  • Nếu bạn di chuyển tập lệnh của mình sang môi trường lưu trữ * nix, chuỗi ma thuật localhost có nghĩa là máy khách MySQL muốn sử dụng ổ cắm Unix nếu được định cấu hình, hiệu quả hơn kết nối dựa trên vòng lặp IP

Nghe có vẻ khá quan trọng?

Chúng không có. Bạn nên thiết kế ứng dụng của mình để loại điều này được định nghĩa trong tệp cấu hình. Nếu bạn di chuyển kịch bản của mình sang một môi trường khác, rất có thể những thứ khác cũng sẽ cần phải cấu hình.

Tóm lại, việc sử dụng địa chỉ IP không phải là giải pháp tốt nhất, nhưng rất có thể là giải pháp có thể chấp nhận được.

Vậy giải pháp tốt nhất là gì?

Cách tốt nhất là thay đổi địa chỉ liên kết mà máy chủ MySQL sử dụng. Tuy nhiên, điều này không đơn giản như người ta có thể thích. Không giống như Apache, Nginx và hầu như mọi ứng dụng dịch vụ mạng lành mạnh khác từng được tạo ra, MySQL chỉ hỗ trợ một địa chỉ liên kết duy nhất, vì vậy nó không chỉ là trường hợp thêm một địa chỉ khác. May mắn thay, các hệ điều hành hỗ trợ một chút phép thuật ở đây, vì vậy chúng ta có thể cho phép MySQL sử dụng đồng thời cả IPv4 và IPv6.

Bạn cần chạy MySQL 5.5.3 hoặc mới hơn và bạn cần khởi động MySQL với đối số dòng lệnh --bind-address= (hoặc đặt tùy chọn tương ứng trong my.ini). Bạn có 4 lựa chọn docs, tùy thuộc vào những gì bạn muốn làm:

  • Một bạn có thể quen với, và một trong đó bạn có khả năng nhất (hiệu quả) sử dụng, 0.0.0.0. Điều này liên kết với tất cả các địa chỉ IPv4 có sẵn trên máy. Điều này thực sự có lẽ không phải là điều tốt nhất để làm ngay cả khi bạn không quan tâm đến IPv6, vì nó bị rủi ro bảo mật tương tự như ::.

  • Địa chỉ IPv4 hoặc IPv6 rõ ràng (ví dụ: 127.0.0.1 hoặc ::1 để lặp lại). Điều này liên kết máy chủ với địa chỉ đó và chỉ địa chỉ đó.

  • Chuỗi ma thuật ::. Điều này sẽ liên kết MySQL với mọi địa chỉ trên máy, cả địa chỉ giao diện lặp và địa chỉ vật lý, trong chế độ IPv4 và IPv6. Đây có thể là một nguy cơ bảo mật, chỉ làm điều này nếu bạn cần MySQL chấp nhận các kết nối từ máy chủ từ xa.

  • Sử dụng IPv4-mapped IPv6 address. Đây là một cơ chế đặc biệt được tích hợp vào IPv6 để tương thích ngược trong quá trình chuyển đổi 4 -> 6, và nó cho phép bạn liên kết với một địa chỉ IPv4 cụ thể và tương đương với IPv6. Điều này có vẻ không hữu ích đối với bạn đối với bất kỳ điều gì khác ngoài địa chỉ "lặp lại kép" ::ffff:127.0.0.1.Đây có thể là giải pháp tốt nhất cho hầu hết mọi người, chỉ liên kết với loopback nhưng cho phép cả kết nối IPv4 và IPv6.

Tôi có cần phải sửa đổi tệp máy chủ không?

NO. Không sửa đổi tệp máy chủ. Trình phân giải DNS biết phải làm gì với localhost, việc xác định lại nó sẽ tốt nhất sẽ không có hiệu lực, và ít nhất là gây nhầm lẫn địa ngục với người giải quyết.

Điều gì về --skip-name-resolve?

Điều này cũng có thể khắc phục được sự cố/được yêu cầu khắc phục sự cố, vì lý do có liên quan nhưng hơi khác.

Nếu không có tùy chọn cấu hình này, MySQL sẽ cố gắng giải quyết tất cả địa chỉ IP kết nối máy khách với tên máy chủ thông qua truy vấn DNS PTR. Nếu máy chủ MySQL của bạn đã được kích hoạt để sử dụng IPv6 nhưng kết nối vẫn mất nhiều thời gian, có thể do bản ghi DNS ngược (PTR) không được định cấu hình chính xác.

Tắt độ phân giải tên sẽ khắc phục sự cố này, nhưng có các nhánh khác, đặc biệt là bất kỳ quyền truy cập nào được định cấu hình để sử dụng tên DNS trong điều kiện Host sẽ bị lỗi.

Nếu bạn định thực hiện việc này, bạn sẽ cần phải định cấu hình tất cả các khoản tài trợ của mình để sử dụng địa chỉ IP thay vì tên.

+12

-1 không jquery gì! – PeeHaa

+0

TL; DR! Lol, thực ra, câu trả lời này là hoàn hảo. Bạn có biết liệu MySQL 5.6 có giải quyết được vấn đề không? Thay vào đó, tôi có thể nâng cấp. (Nhưng, nghiêm túc, không có jQuery?) – MaxArt

+0

Điều này có vẻ là một vấn đề rất phổ biến cho Windows 8 máy với các truy vấn mysql rất chậm (bình luận cho SEO). – Josiah

0

Bất kể máy chủ, sẽ tốt nếu sử dụng các kết nối liên tục bất cứ khi nào có thể. Sau khi tất cả, nó không phải là khôn ngoan để mở kết nối mới tất cả các thời gian khi những người già có thể thực hiện công việc là tốt. Hãy xem số manual cho mysqli.

+0

Tôi gặp sự cố với kết nối liên tục - PHP đôi khi cố tạo kết nối mới mặc dù đã có kết nối hiện tại "miễn phí", dẫn đến lỗi "quá nhiều kết nối". Đó là những năm trước đây mặc dù, vì vậy nó có thể được cố định đã (hoặc nó có thể là ngay cả vấn đề địa phương). – binaryLV

+0

Nó phải được cố định. Các kết nối liên tục cho mysqli được giới thiệu trong PHP 5.3, vì vậy chúng không phải là cũ. – linepogl

+0

Tôi tin rằng tôi có vấn đề với PDO hoặc chức năng mysql cũ. Chưa bao giờ thực sự sử dụng mysqli. – binaryLV

23

Tôi đã có một số sự chậm trễ khi tôi sử dụng localhost làm địa chỉ máy chủ MySQL. Thay đổi nó thành 127.0.0.1 đã giúp.

+0

Được rồi, bạn thật tuyệt vời. Cảm ơn bạn rất nhiều. Tôi đã thay đổi máy chủ thành 127.0.0.1 và các trang của tôi đang hoạt động trong 0,00454560547 giây. Không thể cảm ơn đủ. – Sam

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