web-dev-qa-db-ja.com

PHPシステムのローカルIPを取得する方法

192。* ....のようなコンピューターのローカルIPを取得する必要があります。これはPHPで可能ですか?

スクリプトを実行しているシステムのIPアドレスが必要ですが、外部IPは必要ありません。彼のローカルネットワークカードアドレスが必要です。

84
air

CLIから

PHP <5.3.0

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

PHP> = 5.3.0

$localIP = getHostByName(getHostName());

100
andras.tim
$_SERVER['SERVER_ADDR']
55
Sergey Eremin

これは古い投稿ですが、これで入手できます:

function getLocalIp()
{ return gethostbyname(trim(`hostname`)); }

例えば:

die( getLocalIp() );

別のサイトで見つけた場合は、トリムコマンドを削除しないでください。削除しないと、コンピューター名が取得されます。

BACKTICKS(特別な引用符):PHPはそれらの「特別な引用符」(バックティックス)の間にあるものをシェルコマンドとして実行し、結果の出力を返すため、機能します。

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
29
Codebeat

これを試してください(サーバーがLinuxの場合):

$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
24
George Deac

ローカルマシンのデフォルトの外部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へのルートがない場合は機能しない可能性があります(たとえば、インターネットに接続していない場合)。

17
Arnaud Le Blanc

ローカルの意味に依存します。

ローカルでPHPコードを実行するサーバー/システムのアドレスを意味する場合、議論する2つの方法があります。 PHPがWebサーバーを介して実行されている場合、$_SERVER['SERVER_ADDR']を読み取ることでサーバーのアドレスを取得できます。 PHPがコマンドラインインターフェイスを介して実行されている場合、ipconfig(Windows)/ ifconfig(* nix)をシェル実行してアドレスをgrepで出力する必要があります。

ローカルとは、Webサイト訪問者のリモートアドレスを意味し、外部IPアドレスを意味しない場合(具体的には192. *と言っているため)、運が悪いです。 NATルーティングの全体的なポイントは、そのアドレスを隠すことです。 IPアドレスの背後にある個々のコンピューターのローカルアドレスを特定することはできませんが、同じIPからアクセスするコンピューターが複数ある場合に区別するのに役立ついくつかのトリック(ユーザーエージェント、場合によってはMACアドレス)があります。

15
Fosco

hostname(1)はIPアドレスを伝えることができます:hostname --ip-address、または人が言うように、hostname --all-ip-addressesを使用する方が良いです

10
ern0

LinuxホストのCLIで通常のユーザーとしてこれを試すことができます:

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',
)
6
ab1965
$localIP = gethostbyname(trim(exec("hostname")));

私はWindows PCで試してみましたが、それは機能し、Linuxでも動作すると思います。

4
Pratik Boda

それは非常に簡単で、上記の答えは物事を複雑にします。この方法を使用すると、ローカルIPアドレスとパブリックIPアドレスの両方を取得できます。

   <?php 
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;

$localIp = gethostbyname(gethostname());
echo $localIp;

?>
1

サーバー側の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
1
Gonen

OS Xの開発環境でWifi経由で接続している場合:

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

簡単なものです。この簡単なコードでホスト名を取得できます。

$ip = getHostByName(getHostName());

または、$_SERVER['HTTP_Host']を使用してホスト名を取得することもできます。

0