回答:
$localIP = getHostByName(php_uname('n'));
$localIP = getHostByName(getHostName());
$_SERVER['SERVER_ADDR']
getHostName
、サイトのドメイン名を返さないので、これはまさに私が欲しかったものです。
これは古い投稿ですが、これで取得できます:
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
gethostbyname
がホストマシンのループバックIP(例:127.0.0.1)を返すことは可能であり、有効です。
これを試してください(サーバーがLinuxの場合):
$command="/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'";
$localIP = exec ($command);
echo $localIP;
eth0
適切なインターフェースである保証はありません。
wlan0
代わりにを指定eth0
して置き換える必要がありました。それ以外に、この答えは私が探していた解決策でした。ありがとう!'inet addr:'
'inet adr:'
'inet adr:'
私の端末(フランス語ロケール)では実際にうまく機能しましたが、PHPスクリプト'inet addr:'
では正しい値でした(英語のロケールだと思います)。
ローカルマシンのデフォルトの外部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
(インターネットに接続していない場合など)は機能しない可能性があります。
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_connect($sock, $this->getDockerMachineIp(), 53);
sockets
モジュールがPHPにインストールされ、有効になっている必要があることに言及することも重要です。
ローカルでの意味に依存します。
ローカルとは、PHPコードを実行するサーバー/システムのアドレスを意味する場合でも、議論する2つの方法があります。PHPがWebサーバーを介して実行されている場合は、を読むことでサーバーアドレスを取得できます$_SERVER['SERVER_ADDR']
。PHPがコマンドラインインターフェースを介して実行されている場合は、シェル実行ipconfig
(Windows)/ ifconfig
(* nix)を実行し、アドレスをgrepする必要があります。
ローカルとは、Webサイト訪問者のリモートアドレスを意味し、外部IPアドレスを意味しない場合(具体的には192. *と言っているため)、運が悪かったことになります。NATルーティングの要点は、そのアドレスを隠すことです。IPアドレスの背後にある個々のコンピューターのローカルアドレスを特定することはできませんが、同じIPから複数のコンピューターがアクセスしているかどうかを区別するのに役立ついくつかのトリック(ユーザーエージェント、場合によってはMACアドレス)があります。
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ファイルに追加しました
split()
PHP 5.3.0以降、関数は廃止されました。explode()
代わりに使用を提案
簡単なものです。この簡単なコードでホスト名を取得できます。
$ip = getHostByName(getHostName());
または、を使用$_SERVER['HTTP_HOST']
してホスト名を取得することもできます。
$_SERVER['REMOTE_ADDR']
PHP_SELF
現在のスクリプトのファイル名を、ルートからの相対パスで返します
SERVER_PROTOCOL
ページ要求されたプロトコルの名前とリビジョンを返します
REQUEST_METHOD
ページへのアクセスに使用されるリクエストメソッドを返します
DOCUMENT_ROOT
現在のスクリプトが実行されているルートディレクトリを返します
これを試して
$localIP = gethostbyname(trim('hostname'));