Bestimmen Sie den nächsten Spiegel PHP

8

Ich pflege eine Seite mit einer Reihe herunterladbarer Dateien. Es ist derzeit auf einem Server in den USA gehostet, aber ich habe kürzlich einen neuen Server in Deutschland erworben. Ich möchte die Downloads auf dem Server in Deutschland spiegeln, und ein PHP-Skript auf dem ersten Server (Hosting der Website) erkennen, welche Datei Spiegel basierend auf dem Standort des Benutzers zu verwenden. Wenn sich der Benutzer beispielsweise in Kanada befindet, sollte er die Datei von meinem aktuellen Server in den USA herunterladen. Wenn er in Frankreich ist, sollte er die Datei aus Deutschland beziehen und nicht über den Atlantik herunterladen. Wie kann ich dann feststellen, in welchem ​​Land sie näher sind?

Ich kenne MaxMind GeoIP, und habe es installiert, aber das gibt mir nur ein Land, und AFAIK gibt es keine Möglichkeit, automatisch zu bestimmen, welches meiner beiden Spiegelländer dem gegebenen Land am nächsten ist. Ich denke, was ich tun könnte, ist auf dem Kontinent: Haben Nutzer in Asien, Europa, Afrika und Australien die Inhalte aus Deutschland, und haben Besucher aus Nord- und Südamerika die Datei aus den USA bekommen, wenn jemand eine bessere Lösung finden kann Ich bin offen für Vorschläge.

Nun, ich denke, ich werde mit meiner ursprünglichen Idee, nach Kontinenten zu suchen, gehen. Für andere, die solche Dinge tun wollen, ist das ein guter Anfang. Das Problem wird kommen, wenn ich mehrere Spiegel in Europa habe, aber die Idee des Kontinents wird für jetzt funktionieren müssen.

    
D. Strout 28.01.2012, 21:03
quelle

5 Antworten

2

Scheint in den vorgeschlagenen Lösungen viel Entwickler-Overhead zu sein. Wenn dies ein Problem war, das ich in meinen eigenen Anwendungen angehen musste, könnte ich mir ein paar Stunden Arbeit ersparen, indem ich not ändere, um das Rad auf diesem neu zu erfinden.

Ermitteln des nächstgelegenen Spiegels (mithilfe von Postleitzahlen)

  1. Pflegen Sie eine Liste von Postleitzahlen in einem Array für diese verfügbaren Spiegelserver.
  2. Bestimmen Sie die Postleitzahl des Benutzeragenten (z. B. Benutzereingabe oder PHP-Bibliothek)
  3. Berechnen Sie den Abstand zwischen den beiden Postleitzahlen (z. B. PHP-Bibliothek)
  4. Fahren Sie mit der Spiegelauswahl basierend auf der zurückgegebenen Entfernung fort

Bitte beachten Sie, dass eine kürzere Distanz nicht unbedingt eine schnellere Reaktionszeit bedeutet. Im Kontext Ihres Szenarios ist jedoch ein Spiegel in einem Land offensichtlich schneller als ein Spiegel in einem anderen, vorausgesetzt, beide Spiegel sind oben. Lesen Sie weiter für etwas, das ich für eine "robustere" Lösung halte.

Ressourcen & amp; Links

Der Ansatz "Maverick"

Meiner Meinung nach sind Mavericks auch als Innovatoren, Problemlöser und Erfinder dieser großartigen Bibliotheken und Frameworks bekannt, die wir alle heute benutzen. Manchmal fälschlicherweise mit "hackischen" Ideen verbunden, aber wir begrüßen die Ergänzung:)

  1. Erstellen Sie Ihren eigenen API-Dienst auf einem Ihrer Spiegelserver, der entweder eine $ _GET- oder eine $ _POST-Anfrage akzeptiert.

  2. Dieser API-Dienst nimmt eine ihm zugewiesene IP-Adresse und ping (), berechnet die Antwortzeiten und nimmt dann den Durchschnittswert und gibt ihn an die anfragende Schnittstelle zurück (z. B. Ihr Frontend-Portal, über das sich Clients verbinden und / oder der Server versucht den nächsten Spiegel zu bestimmen). Der Server, der mit dem niedrigsten Durchschnitt antwortet, sollte Ihr am schnellsten reagierender Server sein, wenn auch nicht unbedingt am nächsten. Was ist dir wichtiger? Siehe Ping-Seite und Ergebnis in PHP zurückgeben für einen funktionierenden ping () Funktion, die nicht darauf angewiesen ist, Shell-Befehle lokal auszuführen (z. B. plattformunabhängig).

  3. Im letzten Schritt leiten Sie die IP-Adresse des anfordernden Clients ab und leiten sie an Ihren API-Dienst weiter, der auf einem der beiden Spiegelserver im Hintergrund ausgeführt wird. Und wir alle wissen, wie man die IP ableitet, aber nicht so gut, wie du denkst. Wenn Sie eine Lastverteilung oder einen Proxy verwenden, sollten Sie zunächst prüfen, ob einer dieser Header durchlief (HTTP_FORWARDED, HTTP_FORWARDED_FOR, HTTP_X_FORWARDED, HTTP_X_FORWARDED_FOR, HTTP_CLIENT_IP). Wenn ja, ist das wahrscheinlich die echte IP-Adresse des Benutzeragenten.

Es ist an diesem Punkt (Schritt 3), wo Sie die Mittelwerte der Antwortzeiten vergleichen würden, die jeder Spiegel mit beantwortet hat, als er zum Pingen des Benutzeragenten ging. Fahren Sie dann mit der Auswahl des Spiegels fort, von dem der Benutzeragent heruntergeladen werden soll. Der Service Flow, den Sie angelegt haben, ähnelt dann etwa so:

  1. Benutzeragent besucht Portal
  2. Portal leitet die IP-Adresse des Benutzeragenten an den API-Dienst weiter, der separat auf beiden Spiegelservern ausgeführt wird, wobei eine Hintergrund-AJAX / jQuery-Anforderung (oder traditioneller POST und Redirect) verwendet wird.
  3. Der API-Dienst
  4. , der auf Spiegelservern ausgeführt wird, sendet die IP-Adresse, die er empfängt, und gibt den Durchschnitt der Gesamtzahl der Antworten zurück, für die er konfiguriert wurde.
  5. Portal liest die zurückgegebenen Durchschnittswerte und vergleicht sie.

Hoffe, dass hilft und glücklich Codierung!

    
rdev5 03.05.2012, 16:21
quelle
1
___ antwort10429942 ___

Wenn Sie nur zwei Spiegel haben, starten Sie AJAX-Anfragen in Ihrem Browser, die eine 50K-Datei von jedem Server herunterladen. Dies ist klein genug, um keine große Verzögerung für den Benutzer darzustellen, aber groß genug, um Unterschiede bei der Zeitmessung zu messen - obwohl Sie natürlich mit dieser Figur ein wenig spielen sollten.

Wenn Sie einmal eine "beste Zeit" haben, legen Sie ein JS-Cookie fest und leiten Sie um, wenn ein Download erforderlich ist. Die Messung kann von einer Download-Seite im Hintergrund gestartet werden, so dass der Benutzer die Verzögerung wahrscheinlich nicht bemerkt (während er die gewünschte Datei auswählt).

Du könntest sogar mit einer 'server load' in jedem AJAX op antworten und den besten Server auswählen, nicht nur bei der Antwortzeit, sondern auch bei der aktuellen Last. Ein britischer Benutzer würde also den US-Server verwenden, obwohl der nächste Server in Deutschland liegt, wenn die Last auf dem Server wesentlich höher ist als der erste.

    
___ answer10392715 ___

Ich erinnere mich nicht an irgendeine Bibliothek, die das kann. Aber anstatt ein System zu bauen, Wenn ich eine Idee habe, könnte das Ihnen helfen.

Berechnen Sie den Abstand zwischen zwei IPs mit diesem Entfernungsrechner . Oder ermitteln Sie den Breiten- und Längengrad der beiden IP-Adressen (ein Server) und (einen Gast) und berechnen Sie die Entfernung. Hier ist ein Pseudocode, um das zu tun

%Vor%     
___ answer10435416 ___

Scheint in den vorgeschlagenen Lösungen viel Entwickler-Overhead zu sein. Wenn dies ein Problem war, das ich in meinen eigenen Anwendungen angehen musste, könnte ich mir ein paar Stunden Arbeit ersparen, indem ich not ändere, um das Rad auf diesem neu zu erfinden.

Ermitteln des nächstgelegenen Spiegels (mithilfe von Postleitzahlen)

  1. Pflegen Sie eine Liste von Postleitzahlen in einem Array für diese verfügbaren Spiegelserver.
  2. Bestimmen Sie die Postleitzahl des Benutzeragenten (z. B. Benutzereingabe oder PHP-Bibliothek)
  3. Berechnen Sie den Abstand zwischen den beiden Postleitzahlen (z. B. PHP-Bibliothek)
  4. Fahren Sie mit der Spiegelauswahl basierend auf der zurückgegebenen Entfernung fort

Bitte beachten Sie, dass eine kürzere Distanz nicht unbedingt eine schnellere Reaktionszeit bedeutet. Im Kontext Ihres Szenarios ist jedoch ein Spiegel in einem Land offensichtlich schneller als ein Spiegel in einem anderen, vorausgesetzt, beide Spiegel sind oben. Lesen Sie weiter für etwas, das ich für eine "robustere" Lösung halte.

Ressourcen & amp; Links

Der Ansatz "Maverick"

Meiner Meinung nach sind Mavericks auch als Innovatoren, Problemlöser und Erfinder dieser großartigen Bibliotheken und Frameworks bekannt, die wir alle heute benutzen. Manchmal fälschlicherweise mit "hackischen" Ideen verbunden, aber wir begrüßen die Ergänzung:)

  1. Erstellen Sie Ihren eigenen API-Dienst auf einem Ihrer Spiegelserver, der entweder eine $ _GET- oder eine $ _POST-Anfrage akzeptiert.

  2. Dieser API-Dienst nimmt eine ihm zugewiesene IP-Adresse und ping (), berechnet die Antwortzeiten und nimmt dann den Durchschnittswert und gibt ihn an die anfragende Schnittstelle zurück (z. B. Ihr Frontend-Portal, über das sich Clients verbinden und / oder der Server versucht den nächsten Spiegel zu bestimmen). Der Server, der mit dem niedrigsten Durchschnitt antwortet, sollte Ihr am schnellsten reagierender Server sein, wenn auch nicht unbedingt am nächsten. Was ist dir wichtiger? Siehe Ping-Seite und Ergebnis in PHP zurückgeben für einen funktionierenden ping () Funktion, die nicht darauf angewiesen ist, Shell-Befehle lokal auszuführen (z. B. plattformunabhängig).

  3. Im letzten Schritt leiten Sie die IP-Adresse des anfordernden Clients ab und leiten sie an Ihren API-Dienst weiter, der auf einem der beiden Spiegelserver im Hintergrund ausgeführt wird. Und wir alle wissen, wie man die IP ableitet, aber nicht so gut, wie du denkst. Wenn Sie eine Lastverteilung oder einen Proxy verwenden, sollten Sie zunächst prüfen, ob einer dieser Header durchlief (HTTP_FORWARDED, HTTP_FORWARDED_FOR, HTTP_X_FORWARDED, HTTP_X_FORWARDED_FOR, HTTP_CLIENT_IP). Wenn ja, ist das wahrscheinlich die echte IP-Adresse des Benutzeragenten.

Es ist an diesem Punkt (Schritt 3), wo Sie die Mittelwerte der Antwortzeiten vergleichen würden, die jeder Spiegel mit beantwortet hat, als er zum Pingen des Benutzeragenten ging. Fahren Sie dann mit der Auswahl des Spiegels fort, von dem der Benutzeragent heruntergeladen werden soll. Der Service Flow, den Sie angelegt haben, ähnelt dann etwa so:

  1. Benutzeragent besucht Portal
  2. Portal leitet die IP-Adresse des Benutzeragenten an den API-Dienst weiter, der separat auf beiden Spiegelservern ausgeführt wird, wobei eine Hintergrund-AJAX / jQuery-Anforderung (oder traditioneller POST und Redirect) verwendet wird.
  3. Der API-Dienst
  4. , der auf Spiegelservern ausgeführt wird, sendet die IP-Adresse, die er empfängt, und gibt den Durchschnitt der Gesamtzahl der Antworten zurück, für die er konfiguriert wurde.
  5. Portal liest die zurückgegebenen Durchschnittswerte und vergleicht sie.

Hoffe, dass hilft und glücklich Codierung!

    
___ tag123php ___ PHP ist eine weit verbreitete, dynamische, objektorientierte und interpretierte Skriptsprache, die primär für die serverseitige Webentwicklung entwickelt wurde. ___ tag123geolocation ___ Geolocation ist die Identifizierung des geografischen Standorts eines Objekts, z. B. eines Mobiltelefons oder eines mit dem Internet verbundenen Computerterminals. Verwenden Sie [w3c-geolocation] für Fragen zur W3C-Geolocation-API. ___ answer10429750 ___

Führen Sie eine Traceroute aus (konfigurieren Sie den traceroute-Client so, dass er Hostnamen nicht auflöst und mit einem kleinen Timeout).

Wählen Sie, basierend auf der Anzahl der Hops und der Position des Traceroute-Clients (ich denke, es ist das gleiche wie das PHP-Skript), zwischen den USA und Deutschland aus.

Geografische Entfernung hat nichts mit Netzwerkdistanz und Netzwerkgeschwindigkeit oder Bandbreitenkosten zu tun.

Alternativ zum traceroute (da es eine hackische, kleine Code-Lösung ist), Ich empfehle Ihnen, den $ _SERVER ["REMOTE_ADDR"] zu verwenden und in einer geo ip-Datenbank nachzuschlagen der Ländercode Wenn die Ländervorwahl nicht zu den Ländern auf den amerikanischen Kontinenten gehört, um ein überfülltes Internet-Backbone zu umgehen, kann man nach Deutschland zurückfliegen (außerdem könnte man die Ländervorwahl so festlegen, dass sie aus Europa stammt).

Sobald Sie die Geo-IP-Datenbank eingerichtet haben, empfehle ich Ihnen, die IP-Adressen in den Bereichen vom Punktformat in das Ganzzahlformat zu konvertieren, um die Geschwindigkeit zu erhöhen und die Abfrage zu erleichtern.

Aus meiner Erfahrung mit der oben genannten Geo-IP-Datenbank, vermisst es so selten es ist egal.

    
___ tag123mirroring ___ hilf uns dieses Wiki zu bearbeiten ___ tag123ipaddress ___ Eine Internetprotokolladresse (IP-Adresse) ist eine numerische Bezeichnung, die jedem Gerät in einem Computernetzwerk zugewiesen wird, das das Internetprotokoll für die Kommunikation verwendet. Dies ist ein allgemeiner Tag, der sowohl IPv4 (wie 172.168.100.1) als auch das neuere IPv6 (wie 2012: da8: 0: 1234: 7: 577: 8: 2) abdeckt. Wenn Sie einen dieser Begriffe besonders meinen, verwenden Sie IPv4- oder IPv6-Tags. ___ answer10436176 ___

ist es nicht einfacher, eine Bibliothek wie GeoIP zu verwenden, wie Sie es gesagt haben, und die Breite und Länge zu verwenden, um die Entfernung zwischen den Spiegeln und dem Benutzer zu vergleichen?

Ich denke, es ist weniger kompliziert und es ist sehr einfach zu implementieren, funktioniert für N Spiegeln und Sie müssen nicht nach Zip oder einer anderen Art von Daten fragen, um die Referenzen

zu machen     
___ tag123proximity ___ Ein Näherungssensor (Sensor) ist ein Sensor, der in der Lage ist, Objekte in der Nähe ohne physischen Kontakt zu erkennen. ___ qstntxt ___

Ich pflege eine Seite mit einer Reihe herunterladbarer Dateien. Es ist derzeit auf einem Server in den USA gehostet, aber ich habe kürzlich einen neuen Server in Deutschland erworben. Ich möchte die Downloads auf dem Server in Deutschland spiegeln, und ein PHP-Skript auf dem ersten Server (Hosting der Website) erkennen, welche Datei Spiegel basierend auf dem Standort des Benutzers zu verwenden. Wenn sich der Benutzer beispielsweise in Kanada befindet, sollte er die Datei von meinem aktuellen Server in den USA herunterladen. Wenn er in Frankreich ist, sollte er die Datei aus Deutschland beziehen und nicht über den Atlantik herunterladen. Wie kann ich dann feststellen, in welchem ​​Land sie näher sind?

Ich kenne MaxMind GeoIP, und habe es installiert, aber das gibt mir nur ein Land, und AFAIK gibt es keine Möglichkeit, automatisch zu bestimmen, welches meiner beiden Spiegelländer dem gegebenen Land am nächsten ist. Ich denke, was ich tun könnte, ist auf dem Kontinent: Haben Nutzer in Asien, Europa, Afrika und Australien die Inhalte aus Deutschland, und haben Besucher aus Nord- und Südamerika die Datei aus den USA bekommen, wenn jemand eine bessere Lösung finden kann Ich bin offen für Vorschläge.

Nun, ich denke, ich werde mit meiner ursprünglichen Idee, nach Kontinenten zu suchen, gehen. Für andere, die solche Dinge tun wollen, ist das ein guter Anfang. Das Problem wird kommen, wenn ich mehrere Spiegel in Europa habe, aber die Idee des Kontinents wird für jetzt funktionieren müssen.

    
___ qstnhdr ___ Bestimmen Sie den nächsten Spiegel PHP ___
halfer 03.05.2012 10:55
quelle
0

Ich erinnere mich nicht an irgendeine Bibliothek, die das kann. Aber anstatt ein System zu bauen, Wenn ich eine Idee habe, könnte das Ihnen helfen.

Berechnen Sie den Abstand zwischen zwei IPs mit diesem Entfernungsrechner . Oder ermitteln Sie den Breiten- und Längengrad der beiden IP-Adressen (ein Server) und (einen Gast) und berechnen Sie die Entfernung. Hier ist ein Pseudocode, um das zu tun

%Vor%     
Starx 01.05.2012 02:06
quelle
0

Führen Sie eine Traceroute aus (konfigurieren Sie den traceroute-Client so, dass er Hostnamen nicht auflöst und mit einem kleinen Timeout).

Wählen Sie, basierend auf der Anzahl der Hops und der Position des Traceroute-Clients (ich denke, es ist das gleiche wie das PHP-Skript), zwischen den USA und Deutschland aus.

Geografische Entfernung hat nichts mit Netzwerkdistanz und Netzwerkgeschwindigkeit oder Bandbreitenkosten zu tun.

Alternativ zum traceroute (da es eine hackische, kleine Code-Lösung ist), Ich empfehle Ihnen, den $ _SERVER ["REMOTE_ADDR"] zu verwenden und in einer geo ip-Datenbank nachzuschlagen der Ländercode Wenn die Ländervorwahl nicht zu den Ländern auf den amerikanischen Kontinenten gehört, um ein überfülltes Internet-Backbone zu umgehen, kann man nach Deutschland zurückfliegen (außerdem könnte man die Ländervorwahl so festlegen, dass sie aus Europa stammt).

Sobald Sie die Geo-IP-Datenbank eingerichtet haben, empfehle ich Ihnen, die IP-Adressen in den Bereichen vom Punktformat in das Ganzzahlformat zu konvertieren, um die Geschwindigkeit zu erhöhen und die Abfrage zu erleichtern.

Aus meiner Erfahrung mit der oben genannten Geo-IP-Datenbank, vermisst es so selten es ist egal.

    
Tiberiu-Ionuț Stan 03.05.2012 10:43
quelle
0

ist es nicht einfacher, eine Bibliothek wie GeoIP zu verwenden, wie Sie es gesagt haben, und die Breite und Länge zu verwenden, um die Entfernung zwischen den Spiegeln und dem Benutzer zu vergleichen?

Ich denke, es ist weniger kompliziert und es ist sehr einfach zu implementieren, funktioniert für N Spiegeln und Sie müssen nicht nach Zip oder einer anderen Art von Daten fragen, um die Referenzen

zu machen     
Quaid 03.05.2012 17:10
quelle