जवाबों:
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
getHostName
साइटों का डोमेन नाम वापस न आए।
यह एक पुरानी पोस्ट है, लेकिन इसे इसके साथ प्राप्त करें:
function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }
उदाहरण के लिए:
die( getLocalIp() );
इसे किसी अन्य साइट पर मिला, ट्रिम कमांड को न हटाएं क्योंकि अन्यथा आपको कंप्यूटर का नाम मिल जाएगा।
BACKTICKS (विशेष उद्धरण): यह काम करता है क्योंकि PHP एक "कमांड के रूप में" विशेष उद्धरणों (बैकटिक्स) के बीच जो कुछ भी है उसे चलाने का प्रयास करेगा और परिणामी आउटपुट लौटाएगा।
gethostbyname(trim(`hostname`));
करने की तुलना में बहुत समान (लेकिन बहुत अधिक कुशल) है:
$exec = exec("hostname"); //the "hostname" is a valid command in both windows and linux
$hostname = trim($exec); //remove any spaces before and after
$ip = gethostbyname($hostname); //resolves the hostname using local hosts resolver or DNS
gethostbyname
होस्ट मशीन के लिए लूपबैक आईपी (जैसे 127.0.0.1) लौटना संभव और मान्य है ।
यह प्रयास करें (यदि आपका सर्वर लिनक्स है):
$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
eth0
उचित इंटरफ़ेस है इसकी कोई गारंटी नहीं है।
wlan0
बजाय eth0
और के 'inet addr:'
साथ निर्दिष्ट करना था 'inet adr:'
। इसके अलावा, यह जवाब वह उपाय था जिसकी मुझे तलाश थी। धन्यवाद!
'inet adr:'
में मेरे टर्मिनल (फ्रेंच लोकेल) में काम किया, लेकिन PHP स्क्रिप्ट 'inet addr:'
में सही मूल्य (अंग्रेजी लोकेल, मुझे लगता है) था।
स्थानीय मशीन का डिफ़ॉल्ट बाहरी IP पता इस तरह प्राप्त किया जा सकता है:
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_connect($sock, "8.8.8.8", 53);
socket_getsockname($sock, $name); // $name passed by reference
$localAddr = $name;
यह काम किस प्रकार करता है:
चूंकि यह UDP है, socket_connect
इसलिए नेटवर्क पर नहीं जाता है। यह केवल सॉकेट में एक स्थानीय पता और पोर्ट असाइन करता है। यह हमें स्थानीय पता प्राप्त करने की अनुमति देता है।
यह समाधान बिना किसी नेटवर्क ट्रैफ़िक, DNS, या कमांड निष्पादन के काम करता है।
अगर कोई मार्ग नहीं है तो यह काम नहीं कर सकता है 8.8.8.8
(जैसे आपके पास कोई इंटरनेट कनेक्शन नहीं है)।
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
sockets
करना महत्वपूर्ण है कि पीएचपी पर मॉड्यूल को स्थापित और सक्षम किया जाना चाहिए।
निर्भर करता है कि आप स्थानीय द्वारा क्या मतलब है:
यदि स्थानीय द्वारा आप PHP कोड को निष्पादित करने वाले सर्वर / सिस्टम के पते का मतलब है, तो चर्चा करने के लिए अभी भी दो रास्ते हैं। यदि PHP एक वेब सर्वर के माध्यम से चलाया जा रहा है, तो आप सर्वर पते को पढ़कर प्राप्त कर सकते हैं $_SERVER['SERVER_ADDR']
। यदि PHP एक कमांड लाइन इंटरफेस के माध्यम से चलाया जा रहा है, तो आपको संभवतः शेल-एक्ज़ीक्यूट ipconfig
(विंडोज) / ifconfig
(* nix) और एड्रेस को grep करना होगा।
यदि स्थानीय रूप से आपका मतलब वेबसाइट विज़िटर के रिमोट एड्रेस से है, लेकिन उनके बाहरी आईपी पते से नहीं है (क्योंकि आपने विशेष रूप से 192. * कहा है), तो आप भाग्य से बाहर हैं। NAT रूटिंग का पूरा बिंदु उस पते को छिपाना है। आप एक आईपी पते के पीछे अलग-अलग कंप्यूटरों के स्थानीय पते की पहचान नहीं कर सकते हैं, लेकिन कुछ चालें (उपयोगकर्ता एजेंट, संभवतः मैक पता) हैं जो एक ही आईपी से कई कंप्यूटरों तक पहुँचने में अंतर करने में मदद कर सकती हैं।
आप लिनक्स होस्ट पर CLI में नियमित उपयोगकर्ता के रूप में यह कोशिश कर सकते हैं:
function get_local_ipv4() {
$out = split(PHP_EOL,shell_exec("/sbin/ifconfig"));
$local_addrs = array();
$ifname = 'unknown';
foreach($out as $str) {
$matches = array();
if(preg_match('/^([a-z0-9]+)(:\d{1,2})?(\s)+Link/',$str,$matches)) {
$ifname = $matches[1];
if(strlen($matches[2])>0) {
$ifname .= $matches[2];
}
} elseif(preg_match('/inet addr:((?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:[.](?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3})\s/',$str,$matches)) {
$local_addrs[$ifname] = $matches[1];
}
}
return $local_addrs;
}
$addrs = get_local_ipv4();
var_export($addrs);
आउटपुट:
array (
'eth0' => '192.168.1.1',
'eth0:0' => '192.168.2.1',
'lo' => '127.0.0.1',
'vboxnet0' => '192.168.56.1',
)
array('bond0'=>'10.66.42.83','bond1'=>'hosting Ip address','lo'=>'127.0.0.1', )
मुझे यह मिल गया। मैंने इस कोड को php फाइल में जोड़ा,
split()
फ़ंक्शन को 5.3.0.0 के रूप में परिभाषित किया गया है। इसलिए explode()
इसके बजाय सुझाव का उपयोग करें
$localIP = gethostbyname(trim(exec("hostname")));
मैंने विंडोज पीसी में कोशिश की और इसका काम किया और यह भी सोचा कि क्या यह लिनक्स पर काम करेगा।
यह बहुत सरल है और ऊपर दिए गए उत्तर जटिल चीजें हैं। बस आप इस विधि का उपयोग करके स्थानीय और सार्वजनिक दोनों आईपी पते प्राप्त कर सकते हैं।
<?php
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;
$localIp = gethostbyname(gethostname());
echo $localIp;
?>
यह आसान है। आप इस सरल कोड द्वारा होस्ट नाम प्राप्त कर सकते हैं।
$ip = getHostByName(getHostName());
या आप $_SERVER['HTTP_HOST']
hostname प्राप्त करने के लिए भी उपयोग कर सकते हैं ।
मैंने सर्वर-साइड php (लिनक्स टर्मिनल से चल रहा है) के लिए इस सवाल से फिड किया
मैंने 'ifconfig' में विस्फोट किया और इसे IP पते पर ट्रिम कर दिया।
यह रहा:
$interface_to_detect = 'wlan0';
echo explode(' ',explode(':',explode('inet addr',explode($interface_to_detect,trim(`ifconfig`))[1])[1])[1])[0];
और निश्चित रूप से 'wlan0' को अपने इच्छित नेटवर्क डिवाइस में बदलें।
मेरा आउटपुट है:
192.168.1.5
$_SERVER['REMOTE_ADDR']
PHP_SELF
रूट के सापेक्ष मौजूदा स्क्रिप्ट का फ़ाइल नाम लौटाता है
SERVER_PROTOCOL
पृष्ठ-अनुरोधित प्रोटोकॉल का नाम और संशोधन लौटाता है
REQUEST_METHOD
पृष्ठ तक पहुँचने के लिए उपयोग की गई अनुरोध विधि लौटाता है
DOCUMENT_ROOT
उस रूट डायरेक्टरी को लौटाता है जिसके तहत वर्तमान स्क्रिप्ट निष्पादित हो रही है
इसे इस्तेमाल करे
$localIP = gethostbyname(trim('hostname'));