Hướng dẫn dùng gethostbyname c trong PHP

answer

Show

114

Hướng dẫn dùng gethostbyname c trong PHP

Từ CLI

PHP <5.3.0

$localIP = getHostByName(php_uname('n'));

PHP> = 5.3.0

$localIP = getHostByName(getHostName());

114 hữu ích 5 bình luận chia sẻ

answer

62

62 hữu ích 4 bình luận chia sẻ

answer

32

Đâ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 làm:

$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

32 hữu ích 4 bình luận chia sẻ

answer

24

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;

24 hữu ích 4 bình luận chia sẻ

answer

24

Một cách đáng tin cậy để lấy địa chỉ IP bên ngoài của máy cục bộ là truy vấn bảng định tuyến, mặc dù chúng ta không có cách nào trực tiếp để thực hiện điều đó trong PHP.

Tuy nhiên, chúng tôi có thể yêu cầu hệ thống làm điều đó cho chúng tôi bằng cách liên kết ổ cắm UDP với một địa chỉ công cộng và lấy địa chỉ của nó:

$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

// This is the local machine's external IP address
$localAddr = $name;

socket_connect sẽ không gây ra bất kỳ lưu lượng mạng nào vì đó là ổ cắm UDP.

24 hữu ích 4 bình luận chia sẻ

answer

16

Phụ thuộc vào ý bạn muốn nói đến từ đị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 là đị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 đị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.

16 hữu ích 2 bình luận chia sẻ

answer

10

tên máy chủ (1) có thể cho biết địa chỉ IP: hostname --ip-addresshoặc như người ta nói, tốt hơn là sử dụnghostname --all-ip-addresses

10 hữu ích 0 bình luận chia sẻ

answer

6

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',
)

6 hữu ích 2 bình luận chia sẻ

answer

5

$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.

5 hữu ích 0 bình luận chia sẻ

answer

4

Nó rất đơn giản và những câu trả lời ở trên là những thứ phức tạp. Đơ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 cách sử dụng phương pháp này.

   

4 hữu ích 0 bình luận chia sẻ

answer

2

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ủ.

2 hữu ích 0 bình luận chia sẻ

answer

1

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

1 hữu ích 0 bình luận chia sẻ

answer

0

Nếu bạn đang ở trong môi trường nhà phát triển trên OS X, được kết nối qua Wifi:

echo exec("/sbin/ifconfig en1 | grep 'inet ' | cut -d ' ' -f2");

0 hữu ích 0 bình luận chia sẻ

answer

0

$_SERVER['SERVER_NAME']

Nó đã làm việc cho tôi.

0 hữu ích 0 bình luận chia sẻ

answer

0

Trong cửa sổ

$exec = 'ipconfig | findstr /R /C:"IPv4.*"';
exec($exec, $output);
preg_match('/\d+\.\d+\.\d+\.\d+/', $output[0], $matches);
print_r($matches[0]);

0 hữu ích 0 bình luận chia sẻ

answer

-4

$_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

-4 hữu ích 1 bình luận chia sẻ

answer

-6

Thử cái này

$localIP = gethostbyname(trim('hostname'));

-6 hữu ích 0 bình luận chia sẻ