Câu trả lời:
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
getHostName
không trả về tên miền trang web.
Đây là một bài viết cũ, nhưng hãy lấy nó với cái này:
function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }
Ví dụ:
die( getLocalIp() );
Tìm thấy nó trên một trang web khác, không gỡ bỏ lệnh trim vì nếu không bạn sẽ nhận được tên máy tính.
BACKTICKS (Dấu ngoặc kép): Nó hoạt động vì PHP sẽ cố gắng chạy bất cứ thứ gì nằm giữa các "dấu ngoặc kép" (dấu ngoặc kép) đó như một lệnh shell và trả về kết quả đầu ra.
gethostbyname(trim(`hostname`));
Rất giống (nhưng hiệu quả hơn nhiều) so với:
$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
để trả về một IP lặp lại (ví dụ: 127.0.0.1) cho máy chủ.
hãy thử điều này (nếu máy chủ của bạn là Linux):
$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
eth0
là giao diện phù hợp.
wlan0
thay vì eth0
và thay thế 'inet addr:'
bằng 'inet adr:'
, có thể do ngôn ngữ được sử dụng trên hệ thống của tôi (fr_FR). Ngoài ra, câu trả lời này là giải pháp mà tôi đang tìm kiếm. Cảm ơn!
'inet adr:'
đã hoạt động trong thiết bị đầu cuối của tôi (ngôn ngữ Pháp), nhưng trong tập lệnh PHP 'inet addr:'
là giá trị chính xác (tôi đoán là ngôn ngữ tiếng Anh).
Địa chỉ IP bên ngoài mặc định của máy cục bộ có thể được lấy như sau:
$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;
Làm thế nào nó hoạt động:
Vì đây là UDP, socket_connect
nên không đi ra ngoài mạng. Nó chỉ gán địa chỉ cục bộ và cổng cho ổ cắm. Điều này cho phép chúng tôi có được địa chỉ địa phương.
Giải pháp này hoạt động mà không cần bất kỳ lưu lượng mạng, DNS hoặc thực thi lệnh nào.
Nó có thể không hoạt động nếu không có đường dẫn đến 8.8.8.8
(ví dụ như bạn không có kết nối internet).
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
sockets
mô-đun nên được cài đặt và kích hoạt trên PHP.
Phụ thuộc vào ý bạn muốn nói về địa phương:
Nếu địa chỉ của bạn là địa chỉ của máy chủ / hệ thống thực thi mã PHP, thì vẫn còn hai cách để thảo luận. Nếu PHP đang được chạy thông qua một máy chủ web, thì bạn có thể lấy địa chỉ máy chủ bằng cách đọc $_SERVER['SERVER_ADDR']
. Nếu PHP đang được chạy thông qua một giao diện dòng lệnh, thì bạn có thể phải thực thi trình bao ipconfig
(Windows) / ifconfig
(* nix) và gửi địa chỉ ra.
Nếu địa chỉ của bạn là địa chỉ từ xa của khách truy cập trang web, nhưng không phải địa chỉ IP bên ngoài của họ (vì bạn đã nói cụ thể là 192. *), thì bạn đã không gặp may. Toàn bộ điểm của định tuyến NAT là ẩn địa chỉ đó. Bạn không thể xác định địa chỉ cục bộ của từng máy tính sau một địa chỉ IP, nhưng có một số thủ thuật (tác nhân người dùng, có thể là địa chỉ mac) có thể giúp phân biệt nếu có nhiều máy tính truy cập từ cùng một IP.
Bạn có thể thử điều này với tư cách là người dùng thông thường trong CLI trên máy chủ 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);
Đầu ra:
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', )
Tôi hiểu rồi. Tôi đã thêm mã này vào tệp php,
split()
hàm đã được DEPRECATED kể từ PHP 5.3.0. vì vậy đề nghị sử dụng explode()
thay thế
$localIP = gethostbyname(trim(exec("hostname")));
Tôi đã thử trong máy tính Windows và nó đã hoạt động và cũng nghĩ rằng Sẽ hoạt động trên Linux.
Nó rất đơn giản và những câu trả lời ở trên làm phức tạp mọi thứ. Đơn giản là bạn có thể lấy cả địa chỉ ip cục bộ và địa chỉ IP công cộng bằng phương pháp này.
<?php
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;
$localIp = gethostbyname(gethostname());
echo $localIp;
?>
Nó là một trong những dễ dàng. Bạn có thể lấy tên máy chủ bằng mã đơn giản này.
$ip = getHostByName(getHostName());
Hoặc bạn cũng có thể sử dụng $_SERVER['HTTP_HOST']
để lấy tên máy chủ.
Tôi đã tìm câu hỏi này cho một php phía máy chủ (chạy từ thiết bị đầu cuối Linux)
Tôi đã phát nổ 'ifconfig' và cắt nó xuống địa chỉ IP.
Nó đây:
$interface_to_detect = 'wlan0';
echo explode(' ',explode(':',explode('inet addr',explode($interface_to_detect,trim(`ifconfig`))[1])[1])[1])[0];
Và tất nhiên thay đổi 'wlan0' thành thiết bị mạng mong muốn của bạn.
Đầu ra của tôi là:
192.168.1.5
$_SERVER['REMOTE_ADDR']
PHP_SELF
Trả về tên tệp của tập lệnh hiện tại với đường dẫn liên quan đến gốc
SERVER_PROTOCOL
Trả về tên và bản sửa đổi của giao thức do trang yêu cầu
REQUEST_METHOD
Trả về phương thức yêu cầu được sử dụng để truy cập trang
DOCUMENT_ROOT
Trả về thư mục gốc mà tập lệnh hiện tại đang thực thi
Thử cái này
$localIP = gethostbyname(trim('hostname'));