192。* ....のようなコンピューターのローカルIPを取得する必要があります。これはPHPで可能ですか?
スクリプトを実行しているシステムのIPアドレスが必要ですが、外部IPは必要ありません。彼のローカルネットワークカードアドレスが必要です。
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
これは古い投稿ですが、これで入手できます:
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
これを試してください(サーバーがLinuxの場合):
$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
ローカルマシンのデフォルトの外部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
へのルートがない場合は機能しない可能性があります(たとえば、インターネットに接続していない場合)。
ローカルの意味に依存します。
ローカルでPHPコードを実行するサーバー/システムのアドレスを意味する場合、議論する2つの方法があります。 PHPがWebサーバーを介して実行されている場合、$_SERVER['SERVER_ADDR']
を読み取ることでサーバーのアドレスを取得できます。 PHPがコマンドラインインターフェイスを介して実行されている場合、ipconfig
(Windows)/ ifconfig
(* nix)をシェル実行してアドレスをgrepで出力する必要があります。
ローカルとは、Webサイト訪問者のリモートアドレスを意味し、外部IPアドレスを意味しない場合(具体的には192. *と言っているため)、運が悪いです。 NATルーティングの全体的なポイントは、そのアドレスを隠すことです。 IPアドレスの背後にある個々のコンピューターのローカルアドレスを特定することはできませんが、同じIPからアクセスするコンピューターが複数ある場合に区別するのに役立ついくつかのトリック(ユーザーエージェント、場合によってはMACアドレス)があります。
hostname(1)はIPアドレスを伝えることができます:hostname --ip-address
、または人が言うように、hostname --all-ip-addresses
を使用する方が良いです
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',
)
$localIP = gethostbyname(trim(exec("hostname")));
私はWindows PCで試してみましたが、それは機能し、Linuxでも動作すると思います。
それは非常に簡単で、上記の答えは物事を複雑にします。この方法を使用すると、ローカルIPアドレスとパブリックIPアドレスの両方を取得できます。
<?php
$publicIP = file_get_contents("http://ipecho.net/plain");
echo $publicIP;
$localIp = gethostbyname(gethostname());
echo $localIp;
?>
サーバー側の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
OS Xの開発環境でWifi経由で接続している場合:
echo exec("/sbin/ifconfig en1 | grep 'inet ' | cut -d ' ' -f2");
簡単なものです。この簡単なコードでホスト名を取得できます。
$ip = getHostByName(getHostName());
または、$_SERVER['HTTP_Host']
を使用してホスト名を取得することもできます。