2012-01-28 31 views
8

निर्धारित करें मैं डाउनलोड करने योग्य फ़ाइलों के समूह के साथ एक साइट बनाए रखता हूं। यह वर्तमान में यू.एस. में एक सर्वर पर होस्ट किया गया है, लेकिन मैंने हाल ही में जर्मनी में एक नया सर्वर हासिल किया है। मैं जर्मनी में सर्वर पर डाउनलोड मिरर करना चाहता हूं, और पहले सर्वर पर एक PHP स्क्रिप्ट है (वेबसाइट होस्ट करना) पता लगाएं कि उपयोगकर्ता के स्थान के आधार पर कौन सी फाइल मिरर उपयोग करने के लिए है। उदाहरण के लिए, यदि उपयोगकर्ता कनाडा में है, तो उन्हें यू.एस. में अपने वर्तमान सर्वर से फ़ाइल डाउनलोड करनी चाहिए यदि वे फ्रांस में हैं, तो उन्हें अटलांटिक में डाउनलोड करने के बजाए जर्मनी से फ़ाइल मिलनी चाहिए। तो, मैं कैसे निर्धारित कर सकता हूं कि वे किस देश के करीब हैं?निकटतम दर्पण PHP

मै मैक्समिंड जियोआईपी के बारे में जानता हूं, और इसे स्थापित किया है, लेकिन यह मुझे सिर्फ एक देश देता है, और AFAIK, यह निर्धारित करने का कोई तरीका नहीं है कि मेरे दो दर्पण देशों में से कौन सा देश निकटतम है। मुझे लगता है कि मैं क्या कर सकता हूं महाद्वीप द्वारा जाना जाता है: एशिया, यूरोप, अफ्रीका और ऑस्ट्रेलिया में उपयोगकर्ताओं को जर्मनी से सामग्री मिलती है, और उत्तरी और दक्षिण अमेरिका के आगंतुकों को अमेरिका से फ़ाइल मिलती है यदि कोई बेहतर समाधान के बारे में सोच सकता है , मैं सुझावों के लिए खुला हूं।


ठीक है, मुझे लगता है कि मैं महाद्वीपों की जांच के अपने मूल विचार के साथ जाने जा रहा हूं। दूसरों के लिए इस तरह की चीज करने की तलाश में, यह शुरू करने के लिए एक अच्छी जगह होगी। समस्या तब आ जाएगी जब मेरे पास यूरोप में कई दर्पण हैं, लेकिन महाद्वीप विचार को अभी काम करना होगा।

+0

आप कह सकते हैं गूगल गूगल एपीआई के माध्यम से नक्शे बनाने की जरूरत है न और उस देश के बीच की दूरी की गणना करें जिसमें आईपी उपयोगकर्ता रहते हैं, और आपके दो सर्वर गंतव्यों के आधार पर, उनमें से कौन सा निकटतम है, डाउनलोड मिरर सेट करें। फिर आपके पास केवल दो स्थैतिक चर होते हैं। प्रत्येक सर्वर स्थान के लिए एक। –

+0

मैं इसके साथ अपने क्षेत्र के बाहर waayay हूँ, लेकिन मुझे लगता है * इस संभाल करने के लिए डीएनएस का उपयोग करने का एक तरीका है ...? एक छोटी सी खोज यह उत्पन्न करती है: http://stackoverflow.com/questions/1040545/how-to-dispatch-network-requests-to-the-geographically-closest-server – Aerik

+0

@ जोनासम: बुरा विचार नहीं, लेकिन मुझे विश्वास है दूरी की गणना करने के लिए केवल मानचित्र API का उपयोग नहीं कर सकते हैं, आपको वास्तव में एक नक्शा दिखाना है, जो इस मामले में निश्चित रूप से असंतोषजनक है। –

उत्तर

2

लगता है कि अब तक प्रस्तावित समाधानों में बहुत से डेवलपर ओवरहेड हैं। यदि यह एक समस्या थी तो मुझे अपने स्वयं के अनुप्रयोगों में संबोधित करना पड़ा, मैं इस पर पहिया को फिर से शुरू करने के लिए को चुनकर मुझे कुछ घंटों का काम बचा सकता हूं।

निकटतम मिरर निर्धारण (ज़िप कोड का उपयोग कर)

  1. उन दर्पण उपलब्ध सर्वरों के लिए एक सरणी में डाक कोड की सूची बनाए रखें।
  2. उपयोगकर्ता एजेंट (जैसे उपयोगकर्ता इनपुट या PHP पुस्तकालय) का पिन कोड
  3. दो डाक कोड के बीच दूरी की गणना (जैसे पीएचपी पुस्तकालय)
  4. दूरी के आधार पर दर्पण चयन के साथ आगे बढ़ें लौटे
निर्धारित

कृपया ध्यान रखें कि एक करीबी दूरी आवश्यक प्रतिक्रिया समय नहीं है। हालांकि, आपके परिदृश्य के संदर्भ में, एक देश में एक दर्पण स्पष्ट रूप से दूसरे दर्पण की तुलना में तेज़ होगा, मान लीजिए कि दोनों दर्पण ऊपर हैं। मैं जो अधिक "मजबूत" समाधान मानता हूं उसके लिए पढ़ना जारी रखें।

संसाधन & लिंक

"मेवरिक" दृष्टिकोण

मेरी राय में, मावेरिक्स उन लोगों को भी नवीन आविष्कारों, समस्या समाधानकर्ताओं, और इन महान पुस्तकालयों और चौखटे हम सब उपयोग आज के आविष्कारक के रूप में जाना जाता है। कभी कभी गलती से "hackish" उपायों के साथ संबद्ध है, लेकिन हम गले लगाने के पूरक :)

  1. अपने दर्पण सर्वर की या तो एक ही है कि या तो एक $ _GET या $ _POST अनुरोध को स्वीकार करेंगे पर अपने खुद के एपीआई सेवा बनाएँ।

  2. यह एपीआई सेवा एक आईपी पता लेगी जो इसे दिया गया है और इसे पिंग(), प्रतिक्रिया समय की गणना करना और फिर औसत लेना, इसे अनुरोध करने वाले इंटरफेस पर लौटाना (उदाहरण के लिए आपका फ्रंटेंड पोर्टल जिसके माध्यम से ग्राहक कनेक्ट हो रहे हैं और/या सर्वर निकटतम दर्पण निर्धारित करने की कोशिश कर रहा है)।सर्वर जो सबसे कम औसत के साथ प्रतिक्रिया करता है, वह आपके सबसे तेज़ प्रतिक्रिया सर्वर होना चाहिए, यद्यपि आवश्यक रूप से निकटतम नहीं होना चाहिए। आपके लिए क्या अधिक महत्वपूर्ण है? एक काम करने वाले पिंग() फ़ंक्शन के लिए Ping site and return result in PHP देखें जो स्थानीय स्तर पर शेल कमांड निष्पादित करने पर निर्भर नहीं है (उदा। प्लेटफ़ॉर्म स्वतंत्र)।

  3. अंतिम चरण, अनुरोध करने वाले क्लाइंट का आईपी पता प्राप्त करें और पृष्ठभूमि में दर्पण सर्वर पर चल रहे अपनी एपीआई सेवा को पास करें। और हम सभी जानते हैं कि आईपी कैसे प्राप्त करें, लेकिन साथ ही साथ आपको लगता है कि हम शायद नहीं कर सकते हैं। यदि आप संतुलित या प्रॉक्सी के पीछे लोड कर रहे हैं, तो आप पहले यह देखना चाहते हैं कि इनमें से कोई भी शीर्षलेख आया है (HTTP_FORWARDED, HTTP_FORWARDED_FOR, HTTP_X_FORWARDED, HTTP_X_FORWARDED_FOR, HTTP_CLIENT_IP)। यदि ऐसा है, तो शायद यह वास्तविक उपयोगकर्ता एजेंट का आईपी पता है।

यह इस बिंदु (चरण 3) जहां से प्रतिक्रिया समय है कि प्रत्येक दर्पण जब वे उपयोगकर्ता एजेंट को पिंग के लिए गया था के साथ जवाब दिया की औसत की तुलना होता है। फिर उपयोगकर्ता एजेंट को किस दर्पण से डाउनलोड करना चाहिए चुनने के साथ आगे बढ़ें। सेवा प्रवाह आपके द्वारा बनाए गए होंगे तो कुछ इस तरह से मिलता है:

  1. उपयोगकर्ता एजेंट का दौरा पोर्टल
  2. पोर्टल API (या किसी पृष्ठभूमि AJAX/jQuery अनुरोध का उपयोग कर दोनों दर्पण पर अलग से चल रहे सेवा पारंपरिक करने के लिए उपयोगकर्ता एजेंट के आईपी पते पर अग्रेषित करता पोस्ट और रीडायरेक्ट)।
  3. दर्पण पर चल रही एपीआई सेवा आईपी पते को प्राप्त करती है और इसे प्राप्त करने के लिए कॉन्फ़िगर किए गए प्रतिक्रियाओं की कुल संख्या का औसत देता है।
  4. पोर्टल लौटा औसत पढ़ता है और उनकी तुलना करता है।

आशा है कि कोडिंग में मदद और खुशी होगी!

+1

यह वास्तव में पहला है अच्छा और आसान विचार लागू करने के लिए मैंने अब तक देखा है। मुझे बहुत पसंद है। एक प्रश्न: इस कारण से कितना उपरांत होगा? क्या छोटे अनुरोधों का समूह सर्वर के लिए सौदा करने के लिए मुश्किल हो जाएगा, लगभग 500 आगंतुक/दिन लग रहा है? –

+0

PHP निश्चित रूप से इसके ऊपर और उससे आगे करने में सक्षम है, इसलिए यह प्रोग्रामर पर बेंचमार्क करने के लिए है और अपने प्रदर्शन के मूल्यांकन के लिए अपने कोड के लिए परीक्षण इकाइयां बना रहा है। आपकी चिंता के आस-पास दिमाग में आने वाली एक संभावना एक कैशिंग समाधान के साथ आ रही है जहां सर्वर चयन पूर्व निर्धारित किया गया है। अपने उपयोगकर्ता एजेंट के आईपी पते के नेटवर्क हिस्से का निर्धारण करें और सर्वर को उस नेटवर्क पर असाइन करें (उदा। 1 9 2.168.0.0)। फिर, यदि कोई आने वाला आईपी पता आपके डेटाबेस में नेटवर्क हिस्से से मेल खाता है, तो आपका पोर्टल एपीआई कॉल करने और सर्वर प्रावधान के लिए सीधे कूद सकता है। – rdev5

+0

इसके अलावा, कुछ अन्य बातों को इंगित करने के लिए - कुछ लोग अपने राउटर को आईसीएमपी पिंग्स का जवाब न देने के लिए कॉन्फ़िगर करते हैं, जबकि अन्य लोगों के पास परीक्षण से कनेक्ट करने के लिए अभी भी कोई बंदरगाह नहीं है (मेरे पोस्ट में पिंग() संदर्भ के अनुसार)। यह पूरी तरह से संभव है कि आपको एक अनुरोध का समय समाप्त हो जाएगा। ऐसे मामलों में, मैं आपकी एपीआई सेवा को पोस्टल कोड दूरी गणना फ़ंक्शन में आईपी पर वापस आने के लिए अपडेट करूंगा जो औसत पिंग प्रतिक्रिया को संख्यात्मक आकृति के रूप में वापस करने की बजाय, संख्या को संख्यात्मक आकृति के रूप में वापस कर देता है। फिर, समझने के साथ कि दूरी का मतलब एक तेज़ कनेक्शन नहीं है। – rdev5

0

मुझे ऐसा कोई पुस्तकालय याद नहीं है जो ऐसा कर सकता है। लेकिन एक प्रणाली बनाने के बजाय, अगर मेरे पास कोई विचार है, तो वह आपकी मदद करने में सक्षम हो सकता है।

इस distance calculator का उपयोग करके दो आईपी के बीच की दूरी की गणना करें। या दो आईपी पते (एक सर्वर) और (एक अतिथि) के अक्षांश और देशांतर का पता लगाएं और दूरी की गणना करें। यहाँ कि

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

एक ट्रेसरूट क्या करने के लिए एक स्यूडोकोड है (होस्ट नामों का समाधान नहीं करने के लिए और एक छोटे से समय समाप्ति के साथ ट्रेसरूट क्लाइंट कॉन्फ़िगर)।

होप्स की संख्या और ट्रैसरआउट क्लाइंट के स्थान के आधार पर (मुझे लगता है कि यह PHP स्क्रिप्ट के समान है) यू.एस. और जर्मनी के बीच चयन करें।

भौगोलिक दूरी नेटवर्क दूरी और नेटवर्क की गति, या बैंडविड्थ लागत से कोई लेना देना नहीं है।

वैकल्पिक रूप से ट्रेसरूट (अपने एक hackish, छोटे कोड समाधान के बाद से) के लिए, मैं तुम्हें $ _SERVER [ "REMOTE_ADDR"] का उपयोग करें और देश कोड प्राप्त करने के एक geo ip database में उसे ढूंढने की सलाह देते हैं। यदि देश का कोड अमेरिकी महाद्वीपों के देशों में से एक नहीं है, तो भीड़ वाले इंटरनेट रीढ़ की हड्डी को पार करने से बचने के लिए, जर्मनी में गिरावट (इसके अलावा आप देश कोड को यूरोप से होने की स्थिति दे सकते हैं)।

एक बार जब आप भू-आईपी डेटाबेस सेट अप करते हैं, तो मैं अनुशंसा करता हूं कि आप आईपी पते को गति से प्रारूप में पूर्णांक प्रारूप में और क्वेरीिंग की आसानी के लिए पूर्णांक प्रारूप में कनवर्ट करें।

उपरोक्त भू-आईपी डेटाबेस के साथ अपने अनुभव से, यह बहुत ही कम याद करता है इससे कोई फर्क नहीं पड़ता।

1

यदि आपके पास केवल दो दर्पण हैं, तो अपने ब्राउज़र में AJAX अनुरोधों को बंद करें जो प्रत्येक सर्वर से 50K फ़ाइल डाउनलोड करते हैं। यह उपयोगकर्ता के लिए भारी देरी का प्रतिनिधित्व न करने के लिए पर्याप्त छोटा है, लेकिन टाइमर माप अंतर को महत्वपूर्ण बनाने के लिए काफी बड़ा है - बेशक आपको उस आंकड़े के साथ थोड़ा सा खेलना चाहिए।

फिर, एक बार जब आपको 'सर्वश्रेष्ठ समय' मिल जाए, तो एक जेएस कुकी सेट करें और डाउनलोड किए जाने पर पसंदीदा दर्पण पर रीडायरेक्ट करें।मापन को पृष्ठभूमि में डाउनलोड पेज से निकाल दिया जा सकता है, इसलिए उपयोगकर्ता शायद देरी को नोटिस नहीं करेगा (जबकि वे अपनी इच्छित फ़ाइल का चयन कर रहे हैं)।

आप प्रत्येक AJAX ओप में 'सर्वर लोड' के साथ भी जवाब दे सकते हैं, और प्रतिक्रिया समय पर नहीं बल्कि वर्तमान लोड पर भी सर्वश्रेष्ठ सर्वर का चयन कर सकते हैं। इसलिए, यूके उपयोगकर्ता यूएस सर्वर का उपयोग करेगा, भले ही निकटतम सर्वर जर्मनी में है, अगर बाद में लोड पहले की तुलना में काफी अधिक है।

+0

मुझे वास्तव में यह विचार पसंद है – Sam

0

यह कुछ आसान लाइब्रेरी का उपयोग नहीं करता है जैसे कि आपने कहा था और दर्पण और उपयोगकर्ता को betwen दूरी की तुलना करने के लिए अक्षांश और देशांतर का उपयोग करें?

मुझे लगता है कि इसकी कम जटिल है और इसके बहुत implemen करने के लिए आसान, एन दर्पण के लिए काम करता है और यू ज़िप या डेटा का एक और प्रकार के लिए पूछने के लिए संदर्भ