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


96

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

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

回答:


111

CLIから

PHP <5.3.0

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

PHP> = 5.3.0

$localIP = getHostByName(getHostName());


2
これは私のために働いたソリューションであり、シェル、オペレーティングシステムコマンド、およびセキュリティホールを開いたり、後で奇妙な問題を引き起こしたりする可能性のあるあらゆるものを呼び出すことを回避します。
ダリオフマガリ2014

1
最良の応答は通常、単純さを伴います。そのように。
m3nda 2014年

1
@ andras.tim簡単な答えが好きですが、スクリプトを実行すると、マシンのIPアドレスが返されず、仮想マシンで使用されているIPアドレスが返されます。
Scarl

ただ注意してください。このアプローチは、システムのホスト名に設定されているものをDNSが正しく解決することに依存しています。常にそうであるとは限りません。
ジャスティンマクレア2016

3
クラウドホスティング環境では、これは期待した結果を返さない場合があります。すべてのホストが2つ以上のIPを持っているからです。
UnixAgain、

60
$_SERVER['SERVER_ADDR']

13
明確化:コンピュータは複数のIPアドレスを持つことができます。この変数はHTTPのみで、仮想ホストが実行されているIPアドレスを含みます。質問がどれほどあいまいであるかを考えると、これが予想される答えであるかどうかを判断するのは困難です。
アルバロ・ゴンサレス

私はこれが正しいと思います、あなたは常に署名されたIPを必要とするので、1つはあなたに応答しています。そうでない場合は、@ andras.timのasnwersを使用する必要があります。これは、システムのメインIPを通知するためです。
m3nda 2014年

私のサーバーはロードバランサーの背後にあるためgetHostName、サイトのドメイン名を返さないので、これはまさに私が欲しかったものです。
Yep_It's_Me 2018年


30

これは古い投稿ですが、これで取得できます:

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

例えば:

die( getLocalIp() );

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

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

7
@paul:特別な引用符のため、通常の引用符を使用すると、何らかの理由で機能しなくなり、trimコマンドを削除すると機能しなくなります。奇妙に聞こえます。その答えに反対票を投じるのはよくありません。答えを読んでください。
コードビート

2
バッククォート( `)は、PHPでは実行演算子と呼ばれます。最初のコードブロックで行うことは、execコマンドとほとんど同じです。PHP:実行演算子-マニュアル
Christiaanを

2
本当に最高のアイデアではありません。gethostbynameがホストマシンのループバックIP(例:127.0.0.1)を返すことは可能であり、有効です。
誰もいない

2
これは非常に役立ちます。$ _ SERVER ['REMOTE_ADDR']のような単純なPHP関数があると思いましたうまくいきませんでしたが、この解決策は私にとってはうまくいきました!!!
Pini Cheyni 2016年

24

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

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

9
絶対に正しくない。eth0適切なインターフェースである保証はありません。
誰もいない

おかげで、これは私にとって完璧に機能しました。インターフェイスを設定できることは助けになりました!
Rahim Khoja

私の場合(WiFiローカルネットワークのローカルIP)、システムで使用されているロケール(fr_FR)が原因で、のwlan0代わりにを指定eth0して置き換える必要がありました。それ以外に、この答えは私が探していた解決策でした。ありがとう!'inet addr:''inet adr:'
Niavlys 2017

'inet adr:'私の端末(フランス語ロケール)では実際にうまく機能しましたが、PHPスクリプト'inet addr:'では正しい値でした(英語のロケールだと思います)。
Niavlys 2017

20

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


3
この回答は他の回答よりも優れています。$ _SERVER配列への依存は、Apacheで実行されているこれに依存します。このアイデアはcronジョブでも機能します。サーバーがステージングLANまたは運用LANで実行されている場合にのみ、特定の機能を実行するために使用しています。パーフェクト!
パー

これは重要な答えです。私は、ドッキングウィンドウネットワーク上の私のホストのIPアドレスを取得するためにドッキングウィンドウコンテナを管理するスクリプトでそれを適応:$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
FatherShawn

それは私が推測するよりポータブルです。また、socketsモジュールがPHPにインストールされ、有効になっている必要があることに言及することも重要です。
ファビオモンテフスコロ2018

はい、ありがとうございました。@ Arnaud Le Blanc、私にとって非常に役に立ちました。この手法でIPアドレスを取得しました
Abid Ali

これは私が探しているものです。ありがとう!
Jorz

15

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

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

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


1
最後に重要なことですが、ipconfig / ifconfigは複数のIPアドレスを返す可能性があります。通常、コンピュータには単一のアドレスがないためです。すばらしい答えです。
アルバロ・ゴンサレス

はい、NATの全体的なポイントはローカルIPを非表示にすることです。whatismyip.comは内部IPアドレスを知っています。モバイルを使用してこのWebサイトを開き、モバイルのローカルIPアドレスも知っています。編集:私はJioFiルーターを使用しています。モバイルでは、Android 9のモバイルデータを使用しています
。AOSP

10

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


6

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

array('bond0'=>'10.66.42.83','bond1'=>'hosting Ip address','lo'=>'127.0.0.1', )私はこれを得た。このコードをphpファイルに追加しました
Straw Hat

良い答え、ありがとう。split()PHP 5.3.0以降、関数は廃止されました。explode()代わりに使用を提案
Thanu

4
$localIP = gethostbyname(trim(exec("hostname")));

私はWindows pcで試してみましたが、Linuxでも動作すると思います。


4

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

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

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

?>

2

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

$ip = getHostByName(getHostName());

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


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

0

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

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

0
$_SERVER['SERVER_NAME']

それは私のために働いた。


-4
$_SERVER['REMOTE_ADDR']
  • PHP_SELF 現在のスクリプトのファイル名を、ルートからの相対パスで返します

  • SERVER_PROTOCOL ページ要求されたプロトコルの名前とリビジョンを返します

  • REQUEST_METHOD ページへのアクセスに使用されるリクエストメソッドを返します

  • DOCUMENT_ROOT 現在のスクリプトが実行されているルートディレクトリを返します


すべて当てはまりますが、尋ねられた質問にはまったく関係ありません。-1。
Mark Amery 2016

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.