192. * Gibi bir bilgisayarın yerel IP'sini almam gerekiyor .... Bu PHP ile mümkün mü?
Betiği çalıştıran sistemin IP adresine ihtiyacım var, ancak harici IP'ye ihtiyacım yok, yerel ağ kartı adresine ihtiyacım var.
Yanıtlar:
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
getHostName
olduğundan sitelerin alan adını döndürmüyor.
Bu eski bir gönderi, ancak şununla anla:
function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }
Örneğin:
die( getLocalIp() );
Başka bir sitede buldunuz, trim komutunu kaldırmayın, aksi takdirde bilgisayar adını alırsınız.
BACKTICKS (Özel tırnaklar): PHP bu "özel tırnaklar" (ters işaretler) arasındaki her şeyi bir kabuk komutu olarak çalıştırmaya çalıştığı ve sonuçta ortaya çıkan çıktıyı döndürdüğü için çalışır.
gethostbyname(trim(`hostname`));
Aşağıdakileri yapmaktan çok benzer (ancak çok daha etkilidir):
$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
Ana makine için bir geri döngü IP'si (ör. 127.0.0.1) döndürmek mümkündür ve geçerlidir .
bunu deneyin (sunucunuz Linux ise):
$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
eth0
Uygun arayüzün garantisi yoktur .
wlan0
yerine eth0
ve yerine 'inet addr:'
birlikte 'inet adr:'
muhtemelen sistemimde (fr_FR) üzerinde kullanılan yerele. Onun dışında aradığım çözüm bu cevaptı. Teşekkürler!
'inet adr:'
benim terminalimde (fransızca yerel ayarı) çalıştı, ancak PHP betiğinde 'inet addr:'
doğru değer vardı (İngilizce yerel ayarı, sanırım).
Yerel makinenin varsayılan harici IP adresi şu şekilde elde edilebilir:
$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;
Nasıl çalışır:
Bu UDP olduğu socket_connect
için ağa çıkmaz. Sokete yalnızca yerel bir adres ve bağlantı noktası atar. Bu, yerel adresi almamızı sağlar.
Bu çözüm, herhangi bir ağ trafiği, DNS veya komut yürütme olmadan çalışır.
Giden yol yoksa çalışmayabilir 8.8.8.8
(örneğin internet bağlantınız yok).
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
sockets
modülün PHP'ye yüklenmesi ve etkinleştirilmesi gerektiğini belirtmek önemlidir .
Yerel derken ne demek istediğine bağlı:
Yerel derken PHP kodunu çalıştıran sunucunun / sistemin adresini kastediyorsanız, o zaman tartışılacak iki yol vardır. PHP bir web sunucusu üzerinden çalıştırılıyorsa, okuyarak sunucu adresini alabilirsiniz $_SERVER['SERVER_ADDR']
. PHP bir komut satırı arabirimi üzerinden çalıştırılıyorsa, muhtemelen kabuğu çalıştırmanız ipconfig
(Windows) / ifconfig
(* nix) ve adresi grep etmeniz gerekir .
Yerel derken web sitesi ziyaretçisinin uzak adresini kastediyorsanız, ancak harici IP adresini değil (özellikle 192. * dediğinizden beri), o zaman şansınız yok demektir. NAT yönlendirmesinin tüm amacı bu adresi gizlemektir. Bir IP adresinin arkasındaki bireysel bilgisayarların yerel adreslerini tanımlayamazsınız, ancak aynı IP'den erişen birden fazla bilgisayar olup olmadığını ayırt etmeye yardımcı olabilecek bazı hileler (kullanıcı aracısı, muhtemelen mac adresi) vardır.
Bunu Linux ana bilgisayarında CLI'de normal kullanıcı olarak deneyebilirsiniz:
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);
Çıktı:
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', )
Bunu anladım. Bu kodu php dosyasına ekledim
split()
işlev PHP 5.3.0'dan itibaren KULLANIMDAN KALDIRILMIŞTIR. explode()
onun yerine kullanmayı önerin
$localIP = gethostbyname(trim(exec("hostname")));
Windows pc'de denedim ve çalıştı ve ayrıca Linux üzerinde çalışacağını düşünüyorum.
Çok basit ve yukarıdaki cevaplar işleri karmaşıklaştırıyor. Basitçe bu yöntemi kullanarak hem yerel hem de genel ip adreslerini alabilirsiniz.
<?php
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;
$localIp = gethostbyname(gethostname());
echo $localIp;
?>
Kolay biridir. Ana bilgisayar adını bu basit kodla alabilirsiniz.
$ip = getHostByName(getHostName());
Veya $_SERVER['HTTP_HOST']
ana bilgisayar adını almak için de kullanabilirsiniz .
Sunucu tarafı php için bu soruyla uğraştım (Linux terminalinden çalışan)
'İfconfig'i patlattım ve IP adresine indirdim.
İşte burada:
$interface_to_detect = 'wlan0';
echo explode(' ',explode(':',explode('inet addr',explode($interface_to_detect,trim(`ifconfig`))[1])[1])[1])[0];
Ve tabii ki 'wlan0'ı istediğiniz ağ cihazına değiştirin.
Çıktım:
192.168.1.5
$_SERVER['REMOTE_ADDR']
PHP_SELF
Kök ile göreli yol ile mevcut betiğin dosya adını döndürür
SERVER_PROTOCOL
Sayfanın talep ettiği protokolün adını ve revizyonunu verir
REQUEST_METHOD
Sayfaya erişmek için kullanılan istek yöntemini döndürür
DOCUMENT_ROOT
Geçerli betiğin altında çalıştığı kök dizini döndürür
Bunu dene
$localIP = gethostbyname(trim('hostname'));