2012-01-28 25 views
8

Tôi duy trì một trang web với một loạt các tệp có thể tải xuống. Nó hiện được lưu trữ trên máy chủ ở Hoa Kỳ, nhưng gần đây tôi đã mua một máy chủ mới ở Đức. Tôi muốn phản chiếu các tải xuống máy chủ ở Đức và có một tập lệnh PHP trên máy chủ đầu tiên (lưu trữ trang web) để phát hiện tệp phản chiếu nào sẽ được sử dụng dựa trên vị trí của người dùng. Ví dụ: nếu người dùng ở Canada, họ nên tải xuống tệp từ máy chủ hiện tại của tôi ở Hoa Kỳ. Nếu họ ở Pháp, họ sẽ nhận tệp từ Đức, thay vì tải xuống qua Đại Tây Dương. Làm thế nào, sau đó, tôi có thể xác định quốc gia nào họ gần hơn không?Xác định gương gần nhất PHP

Tôi biết về MaxMind GeoIP và đã cài đặt, nhưng điều đó chỉ mang lại cho tôi một quốc gia và AFAIK, không có cách nào để tự động xác định quốc gia nào của hai quốc gia được chọn gần nhất. Tôi cho rằng những gì tôi có thể làm là đi châu lục: có người dùng ở châu Á, châu Âu, châu Phi và Úc nhận nội dung từ Đức và có khách truy cập từ Bắc và Nam Mỹ nhận được tệp từ Hoa Kỳ. , Tôi đang mở lời đề nghị.


Vâng, tôi đoán tôi sẽ đi với ý tưởng ban đầu của tôi về kiểm tra bởi các châu lục. Đối với những người khác muốn làm điều này, đó sẽ là một nơi tốt để bắt đầu. Vấn đề sẽ xảy ra khi tôi có nhiều gương ở châu Âu, nhưng ý tưởng lục địa sẽ phải làm việc ngay bây giờ.

+0

Bạn có thể gọi Google maps qua API google và tính toán khoảng cách giữa quốc gia mà người dùng IP sống và hai đích máy chủ của bạn, dựa trên đó là điểm đến gần nhất, đặt gương tải xuống. Sau đó, bạn chỉ có hai biến tĩnh. Một cho mỗi vị trí máy chủ. –

+0

Tôi đang waaay bên ngoài khu vực của tôi với điều này, nhưng tôi nghĩ * có một cách để sử dụng dns để xử lý này ...? Một chút tìm kiếm mang lại điều này: http://stackoverflow.com/questions/1040545/how-to-dispatch-network-requests-to-the-geographically-closest-server – Aerik

+0

@ Jonasm: không phải là một ý tưởng tồi, nhưng tôi tin rằng bạn không thể chỉ sử dụng API Maps để tính khoảng cách, bạn thực sự phải hiển thị bản đồ, điều này chắc chắn không đạt yêu cầu trong trường hợp này. –

Trả lời

2

Dường như có rất nhiều chi phí phát triển trong các giải pháp được đề xuất từ ​​trước đến nay. Nếu đây là vấn đề tôi phải giải quyết trong các ứng dụng của riêng mình, tôi có thể tiết kiệm cho tôi một vài giờ làm việc bằng cách chọn không để phát minh lại bánh xe trên thiết bị này.

Xác định nhân bản gần nhất (Sử dụng Mã Zip)

  1. Duy trì một danh sách các mã bưu chính trong một mảng cho các máy chủ mirror sẵn.
  2. Xác định mã bưu chính của các đại lý người dùng (ví dụ như đầu vào người dùng hoặc thư viện PHP)
  3. Tính khoảng cách giữa hai mã bưu chính (ví dụ PHP thư viện)
  4. Tiến hành lựa chọn gương dựa trên khoảng cách trở

Hãy nhớ rằng khoảng cách gần hơn không nhất thiết cấu thành thời gian phản hồi nhanh hơn. Tuy nhiên, trong bối cảnh kịch bản của bạn, một tấm gương ở một quốc gia rõ ràng sẽ nhanh hơn gương trong một chiếc gương khác, giả sử cả hai gương đều sáng lên. Tiếp tục đọc cho những gì tôi cho là một giải pháp "mạnh mẽ" hơn.

Tài & Links

Các "Maverick" Cách tiếp cận

Theo tôi, Mavericks còn được gọi là những nhà cách mạng, giải quyết vấn đề, và các nhà phát minh của những thư viện lớn và các khuôn khổ tất cả chúng ta sử dụng ngày nay. Đôi khi nhầm lẫn với ý tưởng "hackish", nhưng chúng tôi nắm lấy phần bổ sung này :)

  1. Tạo dịch vụ API của riêng bạn trên một trong hai máy chủ nhân bản của bạn chấp nhận yêu cầu $ _GET hoặc $ _POST.

  2. Dịch vụ API này sẽ lấy địa chỉ IP và ping(), tính thời gian phản hồi và sau đó lấy trung bình, trả lại giao diện yêu cầu (ví dụ: cổng giao diện người dùng mà khách hàng đang kết nối và/hoặc máy chủ cố gắng xác định gương gần nhất).Máy chủ phản hồi với mức trung bình thấp nhất phải là máy chủ phản hồi nhanh nhất của bạn, mặc dù không nhất thiết phải gần nhất. Cái nào quan trọng hơn đối với bạn? Xem Ping site and return result in PHP cho hàm ping() đang hoạt động không phụ thuộc vào việc thực hiện các lệnh shell cục bộ (ví dụ: nền tảng độc lập).

  3. Bước cuối cùng, lấy địa chỉ IP của ứng dụng khách yêu cầu và chuyển nó tới dịch vụ API của bạn đang chạy trên máy chủ phản chiếu trong nền. Và tất cả chúng ta đều biết cách lấy được IP, nhưng cũng không phải như bạn nghĩ chúng ta có thể. Nếu bạn đang tải cân bằng hoặc phía sau proxy, trước tiên bạn có thể kiểm tra xem có bất kỳ tiêu đề nào trong số các tiêu đề này đã qua (HTTP_FORWARDED, HTTP_FORWARDED_FOR, HTTP_X_FORWARDED, HTTP_X_FORWARDED_FOR, HTTP_CLIENT_IP) hay không. Nếu có, đó có thể là địa chỉ IP thực của thực tế của tác nhân người dùng.

Tại thời điểm này (Bước 3), bạn sẽ so sánh trung bình thời gian phản hồi mà mỗi gương phản hồi khi họ đến ping tác nhân người dùng. Sau đó tiến hành chọn nhân bản người dùng cần tải xuống. Dòng dịch vụ mà bạn sẽ tạo ra sau đó giống như một cái gì đó như thế này: đại lý thăm

  1. tài cổng
  2. Portal chuyển tiếp địa chỉ IP user agent của dịch vụ API chạy riêng biệt trên cả hai gương sử dụng một nền tảng yêu cầu AJAX/jQuery (hoặc truyền thống POST và chuyển hướng).
  3. Dịch vụ API chạy trên gương ping địa chỉ IP nhận được và trả lại trung bình tổng số câu trả lời được định cấu hình để tìm nạp.
  4. Cổng thông tin đọc số trung bình được trả lại và so sánh chúng.

Hy vọng rằng sẽ giúp và mã hóa hạnh phúc!

+1

Đó là lần đầu tiên thực sự tốt và dễ thực hiện ý tưởng tôi đã thấy cho đến nay. Tôi rất thích nó. Một câu hỏi: chi phí này sẽ gây ra bao nhiêu tiền? Liệu một loạt các yêu cầu nhỏ có gây khó khăn cho máy chủ để xử lý, với khoảng 500 khách truy cập/ngày không? –

+0

PHP chắc chắn có khả năng làm trên và vượt ra ngoài điều này, do đó, nó là lập trình để chuẩn và tạo ra các đơn vị thử nghiệm cho mã của họ để đánh giá hiệu quả của nó. Một khả năng xảy ra với tâm trí xung quanh mối quan tâm của bạn là đến với một giải pháp bộ nhớ đệm nơi lựa chọn máy chủ đã được xác định trước. Xác định phần mạng của địa chỉ IP của tác nhân người dùng của bạn và gán máy chủ cho mạng đó (ví dụ: 192.168.0.0). Sau đó, nếu một địa chỉ IP đến khớp với phần mạng trong cơ sở dữ liệu của bạn, cổng của bạn có thể bỏ qua thực hiện cuộc gọi API và chuyển sang quyền cung cấp máy chủ. – rdev5

+0

Ngoài ra, một điều khác để chỉ ra - một số người định cấu hình bộ định tuyến của họ không trả lời các ping ICMP, trong khi những người khác vẫn không có cổng nào để kết nối với kiểm tra (theo tham chiếu ping() trong bài đăng của tôi). Hoàn toàn có thể là bạn sẽ nhận được yêu cầu hết thời gian chờ. Trong những trường hợp như vậy, tôi sẽ cập nhật dịch vụ API của bạn để quay trở lại IP thành chức năng tính toán khoảng cách mã bưu điện thay vì trả lại phản hồi ping trung bình dưới dạng số, trả về khoảng cách dưới dạng số liệu. Một lần nữa, với sự hiểu biết rằng khoảng cách không nhất thiết có nghĩa là một kết nối nhanh hơn. – rdev5

0

Tôi không nhớ bất kỳ thư viện nào có thể thực hiện việc này. Nhưng thay vì xây dựng một hệ thống, Nếu tôi có một ý tưởng, điều đó có thể giúp bạn.

Tính khoảng cách giữa hai IP bằng cách sử dụng distance calculator này. Hoặc tìm hiểu vĩ độ và kinh độ của hai địa chỉ IP (một máy chủ) và (một khách) và tính khoảng cách. Dưới đây là mã giả để làm điều đó

distance = (3956 *2 * ASIN(SQRT(POWER(SIN((34.1012181 - ABS(latitude)) * PI() /180 /2) , 2) + COS(34.1012181 * PI() /180) * COS(ABS(latitude) * PI() /180) * POWER(SIN((ABS(- 118.325739) - ABS(longitude)) * PI() /180 /2) , 2)))) 
0

Thực hiện theo dõi (định cấu hình máy khách định tuyến để không phân giải tên máy chủ và thời gian chờ nhỏ).

Dựa trên số bước nhảy và vị trí của ứng dụng khách traceroute (tôi cho rằng nó giống với tập lệnh PHP) chọn giữa Hoa Kỳ và Đức.

Khoảng cách địa lý không liên quan đến khoảng cách mạng và tốc độ mạng hoặc chi phí băng thông.

Cách khác để traceroute (vì nó là một giải pháp mã nhỏ), Tôi khuyên bạn nên sử dụng $ _SERVER ["REMOTE_ADDR"] và tra cứu số geo ip database để lấy mã quốc gia. Nếu mã quốc gia không phải là một trong những quốc gia trên lục địa Mỹ, để tránh băng qua đường trục internet đông đúc, dự phòng sang Đức (bổ sung, bạn có thể đặt mã quốc gia là từ châu Âu).

Khi bạn thiết lập cơ sở dữ liệu địa lý ip, tôi khuyên bạn nên chuyển đổi địa chỉ IP trong phạm vi từ định dạng chấm sang định dạng số nguyên cho tốc độ và dễ truy vấn.

Từ kinh nghiệm của tôi với cơ sở dữ liệu địa lý ip ở trên, nó bỏ lỡ rất hiếm khi nó không quan trọng.

1

Nếu bạn chỉ có hai gương, hãy khởi chạy các yêu cầu AJAX trong trình duyệt của bạn tải xuống tệp 50K từ mỗi máy chủ. Điều này đủ nhỏ để không thể hiện sự chậm trễ lớn đối với người dùng, nhưng đủ lớn để tạo sự khác biệt về đo thời gian đáng kể - mặc dù tất nhiên bạn nên chơi với con số đó một chút.

Sau đó, khi bạn đã có 'thời gian tốt nhất', hãy đặt cookie JS và chuyển hướng đến gương ưu tiên bất cứ khi nào cần tải xuống.Việc đo lường có thể được khởi động từ một trang tải xuống trong nền, vì vậy người dùng có thể sẽ không nhận thấy sự chậm trễ (trong khi họ đang chọn tệp mà họ muốn).

Bạn thậm chí có thể trả lời bằng 'tải máy chủ' trong mỗi AJAX op và chọn máy chủ tốt nhất không chỉ trên thời gian phản hồi mà còn trên tải hiện tại. Vì vậy, người dùng Anh sẽ sử dụng máy chủ Hoa Kỳ, mặc dù máy chủ gần nhất ở Đức, nếu tải trên máy chủ sau cao hơn đáng kể so với máy chủ đầu tiên.

+0

Tôi thực sự thích ý tưởng này – Sam

0

không dễ sử dụng hơn một số thư viện như geoip như bạn đã nói và sử dụng vĩ độ và kinh độ để so sánh khoảng cách giữa các gương và người dùng?

Tôi nghĩ rằng nó ít phức tạp hơn và nó rất dễ dàng để implemen, làm việc cho N gương và u không cần phải yêu cầu Zip hoặc một loại dữ liệu để đưa các tài liệu tham khảo