ฉันต้องการรับ IP ภายในของคอมพิวเตอร์เช่น 192 * .... เป็นไปได้ด้วย PHP หรือไม่?
ฉันต้องการที่อยู่ IP ของระบบที่รันสคริปต์ แต่ฉันไม่ต้องการ IP ภายนอกฉันต้องการที่อยู่การ์ดเครือข่ายในพื้นที่ของเขา
ฉันต้องการรับ IP ภายในของคอมพิวเตอร์เช่น 192 * .... เป็นไปได้ด้วย PHP หรือไม่?
ฉันต้องการที่อยู่ IP ของระบบที่รันสคริปต์ แต่ฉันไม่ต้องการ IP ภายนอกฉันต้องการที่อยู่การ์ดเครือข่ายในพื้นที่ของเขา
คำตอบ:
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
getHostName
ไม่ส่งคืนชื่อโดเมนของไซต์
นี่เป็นโพสต์เก่า แต่ใช้สิ่งนี้:
function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }
ตัวอย่างเช่น:
die( getLocalIp() );
พบในเว็บไซต์อื่นอย่าลบคำสั่งตัดออกเพราะมิฉะนั้นคุณจะได้รับชื่อคอมพิวเตอร์
BACKTICKS (เครื่องหมายคำพูดพิเศษ): ทำงานได้เนื่องจาก PHP จะพยายามเรียกใช้สิ่งที่อยู่ระหว่าง "เครื่องหมายคำพูดพิเศษ" (backticks) เป็นคำสั่งเชลล์และส่งกลับผลลัพธ์ที่ได้
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
การส่งคืน IP แบบย้อนกลับ (เช่น 127.0.0.1) สำหรับเครื่องโฮสต์
ลองใช้สิ่งนี้ (หากเซิร์ฟเวอร์ของคุณเป็น Linux):
$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:'
อาจเนื่องมาจากภาษาที่ใช้ในระบบของฉัน (fr_FR) นอกเหนือจากนั้นคำตอบนี้เป็นทางออกที่ฉันกำลังมองหา ขอบคุณ!
'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 ก็ยังมีสองช่องทางในการหารือ ถ้า PHP $_SERVER['SERVER_ADDR']
จะถูกเรียกใช้ผ่านเว็บเซิร์ฟเวอร์แล้วคุณจะได้รับที่อยู่เซิร์ฟเวอร์โดยการอ่าน หาก PHP ถูกเรียกใช้ผ่านอินเทอร์เฟซบรรทัดคำสั่งคุณอาจต้องดำเนินการเชลล์ipconfig
(Windows) / ifconfig
(* nix) และแยกแอดเดรสออก
หากตามท้องถิ่นคุณหมายถึงที่อยู่ระยะไกลของผู้เยี่ยมชมเว็บไซต์ แต่ไม่ใช่ที่อยู่ IP ภายนอกของพวกเขา (เนื่องจากคุณพูดเฉพาะ 192. *) แสดงว่าคุณโชคไม่ดี จุดรวมของการกำหนดเส้นทาง NAT คือการซ่อนที่อยู่นั้น คุณไม่สามารถระบุที่อยู่ภายในของคอมพิวเตอร์แต่ละเครื่องหลังที่อยู่ IP ได้ แต่มีกลเม็ดบางอย่าง (ตัวแทนผู้ใช้อาจเป็นที่อยู่ mac) ที่สามารถช่วยแยกความแตกต่างได้หากมีคอมพิวเตอร์หลายเครื่องเข้าถึงจาก IP เดียวกัน
ชื่อโฮสต์ (1) สามารถบอกที่อยู่ IP: hostname --ip-address
หรือตามที่มนุษย์กล่าวว่าควรใช้hostname --all-ip-addresses
คุณสามารถลองเป็นผู้ใช้ทั่วไปใน CLI บนโฮสต์ Linux:
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()
ฟังก์ชันถูกเลิกใช้งานเมื่อ PHP 5.3.0 ดังนั้นแนะนำให้ใช้explode()
แทน
$localIP = gethostbyname(trim(exec("hostname")));
ฉันลองใช้ Windows pc แล้วมันใช้งานได้และคิดว่าจะทำงานบน Linux ได้
มันง่ายมากและคำตอบข้างต้นเป็นสิ่งที่ซับซ้อน เพียงแค่คุณรับที่อยู่ IP ในพื้นที่และสาธารณะโดยใช้วิธีนี้
<?php
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;
$localIp = gethostbyname(gethostname());
echo $localIp;
?>
มันเป็นเรื่องง่าย คุณสามารถรับชื่อโฮสต์โดยใช้รหัสง่ายๆนี้
$ip = getHostByName(getHostName());
หรือคุณสามารถใช้$_SERVER['HTTP_HOST']
เพื่อรับชื่อโฮสต์
ฉันตอบคำถามนี้สำหรับ php ฝั่งเซิร์ฟเวอร์ (ทำงานจากเทอร์มินัล Linux)
ฉันระเบิด '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
หากคุณอยู่ในสภาพแวดล้อมการพัฒนาบน OS X เชื่อมต่อผ่าน Wifi:
echo exec("/sbin/ifconfig en1 | grep 'inet ' | cut -d ' ' -f2");
$_SERVER['SERVER_NAME']
มันได้ผลสำหรับฉัน
$_SERVER['REMOTE_ADDR']
PHP_SELF
ส่งคืนชื่อไฟล์ของสคริปต์ปัจจุบันด้วยพา ธ ที่สัมพันธ์กับรูท
SERVER_PROTOCOL
ส่งคืนชื่อและการแก้ไขของโปรโตคอลที่ร้องขอเพจ
REQUEST_METHOD
ส่งคืนวิธีการร้องขอที่ใช้เพื่อเข้าถึงเพจ
DOCUMENT_ROOT
ส่งคืนไดเร็กทอรีรากที่สคริปต์ปัจจุบันกำลังเรียกใช้
ลองทำตามนี้
$localIP = gethostbyname(trim('hostname'));