Saya perlu mendapatkan IP lokal komputer seperti 192. * .... Apakah ini mungkin dengan PHP?
Saya perlu alamat IP sistem menjalankan skrip, tetapi saya tidak memerlukan IP eksternal, saya memerlukan alamat kartu jaringan lokalnya.
Jawaban:
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
getHostName
tidak mengembalikan nama domain situs.
Ini adalah posting lama, tapi dapatkan dengan ini:
function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }
Sebagai contoh:
die( getLocalIp() );
Ditemukan di situs lain, jangan hapus perintah trim karena jika tidak Anda akan mendapatkan nama komputer.
BACKTICKS (Tanda kutip khusus): Ini berfungsi karena PHP akan mencoba menjalankan apa pun di antara "tanda kutip khusus" (tanda kutip) itu sebagai perintah shell dan mengembalikan keluaran yang dihasilkan.
gethostbyname(trim(`hostname`));
Sangat mirip (tetapi jauh lebih efisien) daripada melakukan:
$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
mengembalikan IP loopback (misalnya 127.0.0.1) untuk mesin host.
coba ini (jika server Anda adalah Linux):
$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
eth0
apakah antarmuka yang sesuai.
wlan0
bukannya eth0
dan mengganti 'inet addr:'
dengan 'inet adr:'
, mungkin karena lokal yang digunakan pada sistem saya (fr_FR). Selain itu, jawaban ini adalah solusi yang saya cari. Terima kasih!
'inet adr:'
bekerja di terminal saya (lokal perancis), tetapi dalam skrip PHP 'inet addr:'
adalah nilai yang benar (lokal bahasa Inggris, saya kira).
Alamat IP eksternal default dari mesin lokal dapat diperoleh seperti ini:
$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;
Bagaimana itu bekerja:
Karena ini UDP, socket_connect
tidak keluar di jaringan. Ini hanya memberikan alamat lokal dan port ke soket. Ini memungkinkan kami untuk mendapatkan alamat lokal.
Solusi ini bekerja tanpa lalu lintas jaringan, DNS, atau eksekusi perintah.
Ini mungkin tidak berfungsi jika tidak ada rute ke 8.8.8.8
(mis. Anda tidak memiliki koneksi internet).
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
sockets
modul harus diinstal dan diaktifkan di PHP.
Tergantung apa yang Anda maksud dengan lokal:
Jika yang Anda maksud dengan lokal adalah alamat server / sistem yang menjalankan kode PHP, maka masih ada dua cara untuk didiskusikan. Jika PHP dijalankan melalui server web, Anda bisa mendapatkan alamat server dengan membaca $_SERVER['SERVER_ADDR']
. Jika PHP dijalankan melalui antarmuka baris perintah, maka Anda mungkin harus menjalankan shell ipconfig
(Windows) / ifconfig
(* nix) dan menghapus alamatnya.
Jika yang Anda maksud dengan lokal adalah alamat jarak jauh pengunjung situs web, tetapi bukan alamat IP eksternal mereka (karena Anda secara khusus mengatakan 192. *), maka Anda kurang beruntung. Inti dari perutean NAT adalah menyembunyikan alamat itu. Anda tidak dapat mengidentifikasi alamat lokal masing-masing komputer di belakang alamat IP, tetapi ada beberapa trik (agen pengguna, mungkin alamat mac) yang dapat membantu membedakan jika ada beberapa komputer yang mengakses dari IP yang sama.
Anda dapat mencoba ini sebagai pengguna biasa di CLI pada host 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);
Keluaran:
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', )
Saya mengerti. Saya menambahkan kode ini dalam file php,
split()
fungsi telah DIHENTIKAN pada PHP 5.3.0. jadi sarankan untuk menggunakan explode()
sebagai gantinya
$localIP = gethostbyname(trim(exec("hostname")));
Saya mencoba di pc Windows dan itu berhasil dan juga berpikir bahwa akan bekerja di Linux.
Ini sangat sederhana dan jawaban di atas adalah hal-hal yang memperumit. Cukup Anda bisa mendapatkan alamat ip lokal dan publik menggunakan metode ini.
<?php
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;
$localIp = gethostbyname(gethostname());
echo $localIp;
?>
Itu mudah. Anda bisa mendapatkan nama host dengan kode sederhana ini.
$ip = getHostByName(getHostName());
Atau Anda juga bisa menggunakan $_SERVER['HTTP_HOST']
untuk mendapatkan nama host.
Saya mengotak-atik pertanyaan ini untuk php sisi server (berjalan dari terminal Linux)
Saya meledakkan 'ifconfig' dan memangkasnya ke alamat IP.
Ini dia:
$interface_to_detect = 'wlan0';
echo explode(' ',explode(':',explode('inet addr',explode($interface_to_detect,trim(`ifconfig`))[1])[1])[1])[0];
Dan tentu saja ubah 'wlan0' ke perangkat jaringan yang Anda inginkan.
Output saya adalah:
192.168.1.5
$_SERVER['REMOTE_ADDR']
PHP_SELF
Mengembalikan nama file dari skrip saat ini dengan jalur yang berhubungan dengan root
SERVER_PROTOCOL
Menampilkan nama dan revisi protokol yang diminta halaman
REQUEST_METHOD
Mengembalikan metode permintaan yang digunakan untuk mengakses halaman
DOCUMENT_ROOT
Mengembalikan direktori root tempat skrip saat ini dijalankan
Coba ini
$localIP = gethostbyname(trim('hostname'));