2012-03-28 13 views
9

मैं एक PHP अनुप्रयोग विकसित कर रहा हूं जो केवल एक व्यापार के स्थानीय नेटवर्क पर ही चलाया जाएगा। एप्लिकेशन को कस्टम इंस्टॉलर का उपयोग करके सर्वर पर इंस्टॉल किया जाएगा जैसे हमने स्टनिक्स उन्नत वेबसर्वर का उपयोग करके किया था।PHP का उपयोग कर सर्वर का स्थानीय आईपी पता कैसे प्राप्त करूं?

एप्लिकेशन को और अधिक उपयोगकर्ता के अनुकूल बनाने के हिस्से के रूप में मैं सर्वर के स्थानीय आईपी प्रदर्शित करने की योजना बना रहा हूं ताकि नेटवर्क में अन्य कंप्यूटरों के लिए यह केवल आईपी टाइप करके एप्लिकेशन तक पहुंचने के लिए बेहद आसान हो पता पट्टी।

समस्या यह है कि मैं सर्वर के स्थानीय आईपी प्राप्त नहीं कर सकता।

मैं

SERVER_NAME (प्रदर्शित करता है बस 127.0.0.1)

REMOTE_ADDR (प्रदर्शित करता है ग्राहक बाहरी IP)

SERVER_ADDR प्रदर्शित करता है सही आईपी की कोशिश की है लेकिन यह इतना ही करता है अगर मैं इसे आईपी का उपयोग कर क्लाइंट से एक्सेस करता हूं जो पूरी तरह से अपने उद्देश्य को हरा देता है।

मैं सर्वर से http://localhost के माध्यम से सर्वर से सीधे पहुंच पर सर्वर के स्थानीय आईपी प्रदर्शित करना चाहता हूं।

मुझे कुछ हद तक यकीन है कि यह संभव नहीं है। लेकिन अगर ऐसा है, तो कृपया मदद करें।

संपादित

मैं एक क्रॉस मंच पीएचपी बात का सर्वर अनुप्रयोग तरह विकसित कर रहा हूँ। हम अपाचे, PHP इंस्टॉलर्स और एक एसक्यूलाइट डेटाबेस को हमारे PHP एप्लिकेशन के साथ एक क्लिक इंस्टॉलर के रूप में बंडल करते हैं ताकि इसे यथासंभव उपयोगकर्ता के अनुकूल बनाया जा सके। कोई भी विंडोज, मैक या लिनक्स पर चल रहे कंप्यूटर पर इसे तैनात कर सकता है। जब उपयोगकर्ता सर्वर पर एप्लिकेशन खोलता है तो इंस्टॉल करने के बाद वह आईपी पता [स्थानीय आईपी] और पोर्ट देख सकता है जिसका उपयोग इस सर्वर से कनेक्ट करने के लिए किया जा सकता है। आवेदन केवल स्थानीय नेटवर्क पर ही चलाया जाएगा, न कि इंटरनेट पर।

इसे स्थानीय आईपी को एंड्रॉइड ऐप की तरह ही दिखाया जाना चाहिए जिसे एयर Droid करता है। स्क्रीनशॉट: https://lh3.ggpht.com/PmLopRm-Lj9WTnzm2MBI-bTbCLopAyqtd4C_4nvyDwLg8X0QwDbBbEREdWGHG5xku4s

उत्तर

12

समस्या यहां है कि आपको लगता है कि इस जानकारी में से एक स्थिर टुकड़ा नहीं है: 403,210 आप कमांड के साथ सभी उपलब्ध जानकारी देख सकते हैं। किसी भी दिए गए कंप्यूटर में कई नेटवर्क कार्ड से जुड़े कई आईपी पते हो सकते हैं।उनमें से कुछ/सभी/उनमें से कोई भी वेब सेवा उपलब्ध नहीं हो सकता है। आप ओएस से पूछे जाने वाले प्रश्न का एक भी जवाब नहीं हो सकते हैं।

यदि आपके सर्वर के पास एक सरल, एकल आईपी पता कॉन्फ़िगरेशन है तो शायद आप इसे हार्ड-कोड करने के लिए सबसे अच्छे होंगे - यह सबसे आसान विकल्प दूर और दूर है। आप यह गतिशील निर्धारित करने के लिए चाहते हैं, यहाँ जो आपको उम्मीद है कि उपयोगी लगेगी जानकारी के कुछ टुकड़े कर रहे हैं:

  • $_SERVER['HTTP_HOST'] पता है कि पेज पर पहुंचने के लिए ब्राउज़र के एड्रेस बार में टाइप गया था। यदि आप ब्राउज़र में टाइप करके (उदाहरण के लिए) http://192.168.0.1/index.php पृष्ठ पर पहुंचते हैं, $_SERVER['HTTP_HOST']192.168.0.1 होगा।
  • यदि आपने पृष्ठ तक पहुंचने के लिए DNS नाम का उपयोग किया है, तो gethostbyname($_SERVER['HTTP_HOST']); उस DNS नाम को आईपी पते में बदल देगा।
  • $_SERVER['SERVER_NAME'] वह नाम है जो वेब सर्वर कॉन्फ़िगरेशन में कॉन्फ़िगर किया गया है क्योंकि यह सर्वर का नाम है। यदि आप इसका उपयोग करने जा रहे हैं, तो आप PHP में बस हार्ड कोड भी कर सकते हैं।
  • $_SERVER['SERVER_ADDR'] में सर्वर के प्राथमिक आईपी पते की ऑपरेटिंग सिस्टम शामिल होगी। यह आईपी पता हो सकता है या नहीं, जिसका उपयोग पृष्ठ तक पहुंचने के लिए किया गया था, और यह वेब सर्वर के साथ आईपी पता हो सकता है या नहीं। यह ओएस और सर्वर विन्यास पर भारी निर्भर करता है। यदि सर्वर का एक आईपी पता है, तो यह है एक सुरक्षित शर्त है, हालांकि ऐसी स्थितियां हैं जहां इसमें 127.0.0.1 हो सकता है।

इसका संक्षिप्त समय यह है कि वेब सर्वर के गारंटीकृत काम करने वाले आईपी पते को निर्धारित करने के लिए कोई 100% विश्वसनीय तरीका नहीं है, पृष्ठ उत्पन्न करने के लिए वेब सर्वर पर भेजी जाने वाली जानकारी की जांच किए बिना आप बना रहे हैं, जैसा कि आप कहते हैं totally defeats its purpose

+0

आपकी सलाह के लिए धन्यवाद। यह वास्तव में समझ में आता है। यदि सर्वर 2 नेटवर्क से जुड़ा हुआ है (उदाहरण के लिए ईथरनेट और वाईफाई से जुड़ा एक लैपटॉप) मैं मानता हूं कि यह सही नेटवर्क और आईपी चुनने के लिए बेहद अविश्वसनीय होगा। मैंने इस तरह से इस बारे में नहीं सोचा था। बीटीडब्ल्यू उपयोगकर्ता को अपना आईपी पता ढूंढने के लिए एप्लिकेशन को कम n00b अनुकूल बनाता है। :( – ajaybc

+1

@ajaybc यही है कि DNS क्या है ... यदि यह सब स्थानीय है, तो आप नेटवर्क तक पहुंचने के लिए मशीन नामों का उपयोग कर सकते हैं, अगर यह इंटरनेट पर है, तो अपने आईपी पर एक डोमेन/सबडोमेन के ए रिकॉर्ड को इंगित करें ;-) – DaveRandom

0

प्रयास करें:

<?php gethostbyname($_SERVER['SERVER_NAME']);

संपादित करें:

थोड़ा hacky है, लेकिन यह काम करने के लिए लगता है:

<?php 
$str = file_get_contents("http://ip6.me/"); 
$pattern = "#\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b#"; 
preg_match($pattern, $str, $matches); 
print_r($matches[0]); 

लेकिन इस एक तिहाई वेबसाइट पर भरोसा करते हैं।

+0

क्षमा करें, यह काम नहीं करता है। क्योंकि यह ** 127.0.0.1 ** दिखाता है। मैं जो चाहता हूं वह आईपी जैसा है ** 1 9 2.168.1.6 ** जो सर्वर – ajaybc

+0

का स्थानीय आईपी भी है, आपका संपादन भी आजमाया। लेकिन यह सिर्फ सर्वर के ** बाहरी आईपी ** हो जाता है। मुझे सर्वर की ** ** स्थानीय आईपी ** की आवश्यकता है। धन्यवाद – ajaybc

2

मुझे भी यकीन है कि यह संभव नहीं है। या यदि यह संभव है, तो परिणाम विश्वसनीय नहीं होंगे।

एक सर्वर में कई आईपी पते हो सकते हैं। साथ ही, सर्वर पर HTTP के लिए उपयोग किया जाने वाला आईपी पता किसी अन्य जगह से सर्वर तक पहुंचने के लिए उपयोग नहीं किया जा सकता है (यदि कोई रिवर्स प्रॉक्सी या एनएटी शामिल है)। SERVER_ADDR वेरिएबल आईपी पता दिखाता है जिसका उपयोग PHP स्क्रिप्ट को कॉल करने के लिए किया गया था; यह जानकारी वेब सर्वर से गुजरती है, इसलिए यह एक PHP स्क्रिप्ट के लिए मदद नहीं करेगा जो अकेले चल रहा है (यानी एक खोल से)।

चलिए इसे एक और तरीके से देखें। आप कौनसी समस्याएं हल करने की कोशिश कर रहे हैं? यही है, आपको सर्वर के स्थानीय आईपी की आवश्यकता क्यों है? ऐसे समाधान को लागू करने में सहायता प्राप्त करने के बजाय जो काम नहीं करेगा, आइए मूल समस्या देखें और देखें कि क्या कोई दूसरा समाधान संभव है।

मुझे यह इंगित करना चाहिए कि आपके ऑपरेटिंग सिस्टम के आधार पर, ifconfig -a या ip addr जैसे शेल कमांड के आउटपुट को पार्स करके विभिन्न इंटरफेस को आवंटित आईपी की सूची प्राप्त करने के तरीके हो सकते हैं। लेकिन मैं आपके ओएस को नहीं जानता, इसलिए मैं सुझाव नहीं दे सकता कि यह आपके लिए कैसे काम करेगा।

$h = popen("ip addr | awk '/inet/{print$2}'"); 
$ip_list = array(); 
while ($ip_list[] = fread($h, 15)) { } 
pclose($h); 

आप एक पाइप में awk का उपयोग कर से बचने के लिए PHP में अधिक तर्क डाल सकता है, लेकिन आप विचार मिलता है।

+0

I एक क्रॉस प्लेटफार्म PHP सर्वर अनुप्रयोग की तरह काम कर रहा हूँ। हम अपाचे, PHP इंस्टॉलर्स और एक एसक्यूलाइट डेटाबेस को हमारे PHP एप्लिकेशन के साथ एक क्लिक इंस्टॉलर के रूप में बंडल करते हैं ताकि इसे यथासंभव उपयोगकर्ता के अनुकूल बनाया जा सके। कोई भी इसे अपने कंप्यूटर पर तैनात कर सकता है। – ajaybc

+0

ठीक है, ठीक है, अगर आपको यह भी पता नहीं है कि लोग कौन सा ऑपरेटिंग सिस्टम अपना आवेदन चला रहे हैं, या सुरक्षित मोड चालू है या नहीं, तो एक खोल उपकरण इससे मदद नहीं करेगा। जैसा कि मैंने कहा है, यदि आप उस समस्या का वर्णन कर सकते हैं जिसे आप हल करने के बजाय हल करने की कोशिश कर रहे हैं, तो हम आपके समाधान को लागू करने में मदद करने के बजाय उस समस्या को हल करने में मदद कर सकते हैं। – ghoti

+0

कृपया प्रश्न में मेरा संपादन देखें। धन्यवाद – ajaybc

3

समाधान:

  1. php में hardcode (पर स्थापना एक अपनी स्क्रिप्ट में इस संपादित करना चाहिए)
  2. सेटअप अपाचे वातावरण में एक चर ताकि php के माध्यम से (एक को यह जोड़ना चाहिए स्थापना पर पहुँचा जा सकता है अपाचे की कॉन्फ़िगरेशन)
  3. पार्स ifconfig -l या ipconfig -a आउटपुट मशीन के नेटवर्क इंटरफेस के आईपी पते निर्धारित करने के लिए, लूपबैक इंटरफेस को बहिष्कृत करें। सबसे अच्छे मामले में आपको एक आईपी पता प्राप्त होगा - और यह आपको आवश्यक पता होगा, $_SERVER['SERVER_PORT'] जोड़ना। यदि आपको कई आईपी पते मिलेंगे - तो आप यह जांचने के लिए सभी को पूछ सकते हैं कि वे $_SERVER['SERVER_PORT'] पर HTTP अनुरोधों का उत्तर देते हैं या नहीं। यदि आप अलग-अलग आईपी पते पर कई HTTP सर्वर चलाते हैं तो आप अपने आईपी पते को निर्धारित करने के लिए फ़ाइल को echo "my application"; के साथ डाल सकते हैं।
+0

प्रश्न – ajaybc

+0

पर मेरा संपादन देखें ठीक है, मैं तीसरे भाग का उपयोग करता हूं। लेकिन PHP को 'exec() 'करने और विभिन्न पार्सिंग algorythms का उपयोग करने में सक्षम होना चाहिए, विंडोज़ के लिए ओएस -' ipconfig -a', यूनिक्स के लिए ifconfig -l', –

2

आप लैन आईपी पता192.168.x.x की तरह आप नीचे दिए गए कोड का उपयोग कर सकते प्राप्त करना चाहते हैं:

मैं इस का उपयोग कर रहा है और पूरी तरह से मेरी आवश्यकता को पूरा। (केवल विंडोज मशीन में परीक्षण किया गया)

function getLocalIP(){ 
    exec("ipconfig /all", $output); 
     foreach($output as $line){ 
      if (preg_match("/(.*)IPv4 Address(.*)/", $line)){ 
       $ip = $line; 
       $ip = str_replace("IPv4 Address. . . . . . . . . . . :","",$ip); 
       $ip = str_replace("(Preferred)","",$ip); 
      } 
     } 
    return $ip; 
} 

echo $ip = getLocalIP(); //This will return: 192.168.x.x (Your Local IP) 

उम्मीद है कि इससे मदद मिलती है। =)

+2

'ipconfig' केवल विंडोज़ है। बहुत उपयोगी नहीं है। – kodeart

0

"ifconfig en1 inet" कमांड का उपयोग करने का प्रयास करें।

print_r(exec("ifconfig en1 inet"));

आउटपुट: - मंत्रिमंडल 192.168। नेटमास्क 0xffffff00 प्रसारण 192.168। * 255

+0

ifconfig विंडोज़ के लिए नहीं है –

संबंधित मुद्दे