8
votes

Déterminer le miroir le plus proche php

Je maintiens un site avec un tas de fichiers téléchargeables. Il est actuellement hébergé sur un serveur dans les États-Unis, mais j'ai récemment acquis un nouveau serveur en Allemagne. Je voudrais refléter les téléchargements sur le serveur en Allemagne et disposer d'un script PHP sur le premier serveur (hébergeant le site Web) détecter quel miroir de fichier à utiliser en fonction de l'emplacement de l'utilisateur. Par exemple, si l'utilisateur est au Canada, ils doivent télécharger le fichier à partir de mon serveur actuel à l'US IL SI SUIS EN FRANCE, ils doivent obtenir le dossier de l'Allemagne plutôt que de télécharger l'Atlantique. Comment puis-je déterminer quel pays ils sont plus proches de?

Je sais sur Maxmind Geoip et je l'ai installé, mais cela me donne un pays, et Afaik, il n'ya aucun moyen de déterminer automatiquement lequel de mes deux pays miroirs le pays donné est le plus proche. Je suppose que ce que je pouvais faire est de passer par le continent: demandez aux utilisateurs d'Asie, d'Europe, d'Afrique et d'Australie, d'obtenir le contenu de l'Allemagne et des visiteurs d'Amérique du Nord et du Sud obtiennent le dossier des États-Unis si quelqu'un peut penser à une meilleure solution , Je suis ouvert aux suggestions.


Eh bien, je suppose que je vais aller aller avec mon idée originale de vérifier par des continents. Pour d'autres cherchant à faire ce genre de chose, ce sera un bon endroit pour commencer. Le problème viendra quand j'ai plusieurs miroirs en Europe, mais l'idée du continent devra travailler pour l'instant.


9 commentaires

Vous pouvez appeler Google Maps via Google API et calculer la distance entre le pays L'utilisateur IP en direct et vos deux destinations de serveur, sur la base desquelles d'entre eux sont les plus proches, définissez le miroir de téléchargement. Ensuite, vous n'avez que deux variables statiques. Un pour chaque emplacement du serveur.


Je suis waaay en dehors de ma région avec cela, mais je pense Il y a un moyen d'utiliser DNS pour gérer cela ...? Un peu de recherche ceci: Stackoverflow.com/Questtions/1040545/...


@Jonasm: Pas une mauvaise idée, mais je pense que vous ne pouvez pas simplement utiliser les cartes API pour calculer la distance, vous devez réellement montrer une carte, qui est définitivement insatisfaisante dans ce cas.


Vous pouvez toujours masquer la carte dans un conteneur non visible et tirer simplement les données requises. Ce sera le moyen le plus rapide et le plus simple pour vous, je crois


@Jonasme vous devez réellement Afficher la carte. Voir code.google.com/apis/maps/TERMS.html , section 10.1.1 Partie (g).


Au lieu de créer vos propres miroirs, avez-vous regardé Amazon Cloudfront, ou Akamai, ou l'un des nombreux autres réseaux de distribution de contenu. Ils s'occuperaient de tout cela pour vous.


@Bumperbox dans ma situation Ce n'est pas réalisable. C'est une bonne idée pour ceux qui peuvent le permettre, mais je gère ce site sur un budget à os très nu. Vraiment, je pouvais faire entièrement un système de miroir sensible à une localisation, mais je me sens comme si c'était quelque chose qui devrait être faisable et j'espère que cette question (et j'espère une bonne réponse) pourra être référencée par des personnes ayant besoin de faire cela. Il semble un scénario assez commun.


L'utilisation d'Anycast DNS est la meilleure façon de le faire, de couper une longue histoire courte, tous vos serveurs obtenir la même adresse IP et les mêmes utilisateurs sont déroutés de manière transparente sur le plus proche sans aucun code requis. Cela présente également de la protection de votre chute si un serveur diminue et la possibilité d'ajouter de nouveaux serveurs sans se soucier de la charge de modifications apportées à votre application à chaque fois.


Php.net a une sélection de miroir / offre par pays, php.net/source.php?url=/include/ip-to-country.inc


5 Réponses :


0
votes

Je ne me souviens pas d'une bibliothèque pouvant faire cela. Mais au lieu de construire un système, si j'ai une idée, cela pourrait être capable de vous aider.

Calculez la distance entre deux IP en utilisant ce Calculateur de distance . Ou découvrez la latitude et la longitude de l'adresse IP (un serveur) et (un invité) et calculez la distance. Voici un pseudocode pour faire cela P>

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 commentaires

0
votes

faire une traceroute (configurez le client Traceroute pour ne pas résoudre les noms d'hôte et avec un petit délai d'attente).

Basé sur le nombre de sauts et l'emplacement du client Traceroute (je suppose qu'il est identique à celui du script PHP) Sélectionnez entre U.S. et Allemagne.

La distance géographique n'a rien à voir avec la distance réseau et la vitesse du réseau, ou des coûts de bande passante.

alternativement à la traceroute (depuis sa solution pirate de codes piraquine), Je vous recommande d'utiliser le $ _Server ["Remote_addr"] et consultez-le dans un Base de données Geo IP < / a> pour obtenir le code de pays. Si le code du pays n'est pas l'un des pays des continents américains, pour éviter de franchir une colonne vertébrale sur Internet surpeuplée, de replier en Allemagne (en plus de condition que vous puissiez conditionner le code de pays d'Europe).

Une fois que vous avez configuré la base de données GEO IP, je vous recommande de convertir les adresses IP dans les gammes de format en pointillé au format entier pour la vitesse et la facilité d'interrogation.

De mon expérience avec la base de données GEO IP ci-dessus, il manque si rarement que cela n'a pas d'importance.


0 commentaires

1
votes

Si vous n'avez que deux miroirs, lancez les demandes Ajax sur votre navigateur qui téléchargent un fichier 50K de chaque serveur. Ceci est suffisamment petit pour ne pas représenter un délai énorme pour l'utilisateur, mais suffisamment grand pour rendre les différences de mesure de la minuterie significatives - bien que vous devriez jouer avec ce chiffre un peu.

Puis, une fois que vous avez un "meilleur moment", définissez un cookie JS et rediriger vers le miroir préféré chaque fois qu'un téléchargement est requis. La mesure peut être lancée à partir d'une page de téléchargement en arrière-plan, de sorte que l'utilisateur ne remarque probablement pas le délai (tandis qu'ils sélectionnent le fichier qu'ils veulent).

Vous pouvez même répondre avec une «charge de serveur» dans chaque AJAX OP également et sélectionnez le meilleur serveur non seulement sur le temps de réponse, mais sur la charge actuelle également. Ainsi, un utilisateur britannique utiliserait le serveur américain, même si le serveur le plus proche est en Allemagne, si la charge de ce dernier est nettement supérieure à celle du premier.


1 commentaires

J'aime bien cette idée



2
votes

semble qu'il y a beaucoup de frais de développement dans les solutions proposées jusqu'à présent. Si c'était un problème, je devais m'adresser à mes propres applications, je pourrais me sauver quelques heures de travail en optant pas pour réinventer la roue sur celui-ci.

déterminer le miroir le plus proche (à l'aide de codes postaux)

  1. Maintenir une liste de codes postaux dans un tableau pour les serveurs miroirs disponibles.
  2. Déterminez le code postal de l'agent utilisateur (E.G. Entrée utilisateur ou bibliothèque PHP)
  3. Calculez la distance entre les deux codes postaux (E.G. Bibliothèque PHP)
  4. Procédez avec la sélection de miroir basée sur la distance renvoyée

    Veuillez garder à l'esprit qu'une distance plus étroite ne constitue pas nécessairement une durée de réponse plus rapide. Dans le contexte de votre scénario, cependant, un miroir dans un pays sera évidemment plus rapide qu'un miroir dans un autre, en supposant que les deux miroirs sont en place. Continuez à lire pour ce que je considère comme une solution plus "robuste".

    ressources et liens

    • PHP 5 Code postal Plage et distance de distance: http://www.micahcarrick.com/php5-zip-code-range-and-distance.html

    • Redirection basée sur le pays IP2nation: http://www.ip2nation.com/ip2nation / Échantillon_scripts / country_based_redirect

    • Peut également être bon de rechercher une vidange de bibliothèque ou de mySQL qui vous aidera à tirer le code postal ou la région d'une adresse IP donnée (E.G. IP2NATION). Exemple: Comment déterminer un code postal et ville d'une adresse IP?

      l'approche "Maverick"

      À mon avis, les Mavericks sont également connus comme ces innovateurs, résolveurs de problèmes et inventeurs de ces grandes bibliothèques et cadres que nous utilisons tous aujourd'hui. Parfois associé à tort avec des idées "pirates", mais nous embrassons le complément :)

      1. Créez votre propre service d'API sur l'un ou l'autre de vos serveurs de miroir qui accepteront une demande $ _GET ou $ _Post.

      2. Ce service API prendra une adresse IP, il est donné et ping (), calculant les temps de réponse, puis en prenant la moyenne, le renvoyant à l'interface requis (par exemple, votre portail frontal via lequel les clients se connectent et / ou le serveur essayant de déterminer le miroir le plus proche). Le serveur qui répond avec la moyenne la plus bas doit être votre serveur de réponse le plus rapide, mais pas nécessairement le plus proche. Qu'est-ce qui est le plus important pour toi? Voir Site ping et retour Résultat à PHP pour un ping de travail () fonction qui ne s'appuie pas sur l'exécution des commandes shell d'exécution localement (par exemple, indépendante de la plate-forme).

      3. dernière étape, dérivez l'adresse IP du client demandeur et transmettez-la à votre service API exécutant sur un serveur de miroir en arrière-plan. Et nous savons tous comment dériver la propriété intellectuelle, mais pas aussi bien que vous pensez que nous pourrions. Si vous êtes chargé de chargement ou derrière un proxy, vous voudrez peut-être vérifier pour voir si l'un de ces en-têtes est passé (http_forwarded, http_forwarded_for, http_x_forwarded_for, http_client_ip). Si tel est le cas, c'est probablement l'adresse IP de l'agent utilisateur.

        C'est à ce stade (étape 3) où vous comparez les moyennes des temps de réponse que chaque miroir a répondu avec quand ils sont allés à Ping l'agent utilisateur. Ensuite, procédez avec la sélection de laquelle l'agent utilisateur doit-il télécharger à partir de. Le flux de service que vous aurez créé ressemble à quelque chose comme ceci:

        1. Agent utilisateur Visites Portail
        2. Portail Transférer l'adresse IP de l'agent utilisateur au service API fonctionnant séparément sur les deux miroirs à l'aide d'une demande de fond AJAX / JQuery (ou post traditionnel et redirection).
        3. Service API en cours d'exécution sur des miroirs pings L'adresse IP qu'il reçoit et renvoie une moyenne du nombre total de réponses qu'il est configuré pour aller chercher.
        4. Portal lit les moyennes retournées et les compare.

          espère que cela aide et joyeux codage!


3 commentaires

C'est la première idée vraiment bonne et facile à mettre en œuvre que j'ai vue jusqu'à présent. Je l'aime beaucoup. Une question: combien de frais généraux cette cause sera-t-elle? Le groupe de petites demandes finira-t-il à étant difficile pour le serveur de gérer, de figurer environ 500 visiteurs / jour?


PHP est certainement capable de faire au-delà et au-delà de cela, il appartient donc au programmeur de repasser et de créer des unités de test pour son code pour évaluer ses performances. Une possibilité qui vient à l'esprit entourant votre préoccupation consiste à trouver une solution de mise en cache où la sélection du serveur a été prédéterminée. Déterminez la partie réseau de l'adresse IP de votre agent utilisateur et attribuez au serveur à ce réseau (par exemple 192.168.0.0). Ensuite, si une adresse IP entrante correspond à une partie réseau dans votre base de données, votre portail peut sauter effectuer l'appel de l'API et passer à droite au provisioning du serveur.


En outre, une autre chose à signaler - certaines personnes configurent leurs routeurs pour ne pas répondre aux pings ICMP, tandis que d'autres n'ont toujours aucun ports disponibles pour se connecter au test (par la référence ping () dans mon poste). Il est tout à fait possible que vous obteniez une demande expirée. Dans de tels cas, je mettrais à jour votre service d'API pour revenir à une fonction IP à la fonction de calcul de la distance d'indicateur de code postal qui au lieu de renvoyer la réponse ping moyenne sous forme de chiffre numérique, retourne la distance comme une figure numérique. Encore une fois, avec la compréhension de la distance ne signifie pas nécessairement une connexion plus rapide.



0
votes

Ce n'est pas plus facile d'utiliser une bibliothèque comme Geoip comme vous l'avez dit et utilisez la latitude et la longitude pour comparer la distance entre les miroirs et l'utilisateur?

Je pense que c'est moins compliqué et c'est très facile à impliquer, fonctionne pour n miroirs et vous n'avez pas besoin de demander le zip ou un autre type de données pour faire les références


0 commentaires