Aside from the obvious (localhost, 127.0.0.1) does PHP (command line interface!) have a mechanism for discovering the IP of the computer the script is running on?
除了显而易见的(localhost, 127.0.0.1)之外,PHP(命令行接口!)是否有一种机制来发现脚本正在运行的计算机的IP ?
$_SERVER[*]
will not work as this is not a Web app - this is a command line script.
$_SERVER[*]将无法工作,因为这不是一个Web应用程序——这是一个命令行脚本。
TIA
蒂雅
5 个解决方案
#2
28
try this it should return the ip address of the server
尝试一下,它应该返回服务器的ip地址
$host= gethostname();
$ip = gethostbyname($host);
#3
14
If you are working with PHP < 5.3, this may help (on *NIX based systems atleast):
如果您使用的是PHP < 5.3,这可能会有所帮助(至少在基于*NIX的系统上):
mscharley@S04:~$ cat test.php
#!/usr/bin/env php
<?php
function getIPs($withV6 = true) {
preg_match_all('/inet'.($withV6 ? '6?' : '').' addr: ?([^ ]+)/', `ifconfig`, $ips);
return $ips[1];
}
$ips = getIPs();
var_dump($ips);
mscharley@S04:~$ ./test.php
array(5) {
[0]=>
string(13) "72.67.113.141"
[1]=>
string(27) "fe80::21c:c0ff:fe4a:d09d/64"
[2]=>
string(13) "72.67.113.140"
[3]=>
string(9) "127.0.0.1"
[4]=>
string(7) "::1/128"
}
mscharley@S04:~$
Or, if you don't anticipate doing it often, then perhaps this would work (just don't abuse it):
或者,如果你不期望经常这样做,那么这可能会有用(只是不要滥用它):
$ip = file_get_contents('http://whatismyip.org/');
#4
8
I know this is a fairly old question, but there doesn't seem to be a definitive answer (in as much as one is possible.) I've had a need to determine this value, both on *NIX boxes and on Win X boxes. Also from a CLI executed script as well as a non-CLI script. The following function is the best I've come up with, which borrows on different concepts people have spoke of over the years. Maybe it can be of some use:
我知道这是一个相当古老的问题,但似乎没有一个明确的答案(尽可能多地)。我需要确定这个值,在*NIX框和Win X框上。也来自CLI执行的脚本和非CLI脚本。下面的函数是我想到的最好的函数,它借鉴了人们多年来谈到的不同概念。也许它有一些用处:
function getServerAddress() {
if(isset($_SERVER["SERVER_ADDR"]))
return $_SERVER["SERVER_ADDR"];
else {
// Running CLI
if(stristr(PHP_OS, 'WIN')) {
// Rather hacky way to handle windows servers
exec('ipconfig /all', $catch);
foreach($catch as $line) {
if(eregi('IP Address', $line)) {
// Have seen exec return "multi-line" content, so another hack.
if(count($lineCount = split(':', $line)) == 1) {
list($t, $ip) = split(':', $line);
$ip = trim($ip);
} else {
$parts = explode('IP Address', $line);
$parts = explode('Subnet Mask', $parts[1]);
$parts = explode(': ', $parts[0]);
$ip = trim($parts[1]);
}
if(ip2long($ip > 0)) {
echo 'IP is '.$ip."\n";
return $ip;
} else
; // TODO: Handle this failure condition.
}
}
} else {
$ifconfig = shell_exec('/sbin/ifconfig eth0');
preg_match('/addr:([\d\.]+)/', $ifconfig, $match);
return $match[1];
}
}
}
#5
3
If all else fails, you could always exec ipconfig or ifconfig, depending on your platform, and parse the result.
如果所有这些都失败了,您可以始终执行ipconfig或ifconfig,这取决于您的平台,并解析结果。
#1
#2
28
try this it should return the ip address of the server
尝试一下,它应该返回服务器的ip地址
$host= gethostname();
$ip = gethostbyname($host);
#3
14
If you are working with PHP < 5.3, this may help (on *NIX based systems atleast):
如果您使用的是PHP < 5.3,这可能会有所帮助(至少在基于*NIX的系统上):
mscharley@S04:~$ cat test.php
#!/usr/bin/env php
<?php
function getIPs($withV6 = true) {
preg_match_all('/inet'.($withV6 ? '6?' : '').' addr: ?([^ ]+)/', `ifconfig`, $ips);
return $ips[1];
}
$ips = getIPs();
var_dump($ips);
mscharley@S04:~$ ./test.php
array(5) {
[0]=>
string(13) "72.67.113.141"
[1]=>
string(27) "fe80::21c:c0ff:fe4a:d09d/64"
[2]=>
string(13) "72.67.113.140"
[3]=>
string(9) "127.0.0.1"
[4]=>
string(7) "::1/128"
}
mscharley@S04:~$
Or, if you don't anticipate doing it often, then perhaps this would work (just don't abuse it):
或者,如果你不期望经常这样做,那么这可能会有用(只是不要滥用它):
$ip = file_get_contents('http://whatismyip.org/');
#4
8
I know this is a fairly old question, but there doesn't seem to be a definitive answer (in as much as one is possible.) I've had a need to determine this value, both on *NIX boxes and on Win X boxes. Also from a CLI executed script as well as a non-CLI script. The following function is the best I've come up with, which borrows on different concepts people have spoke of over the years. Maybe it can be of some use:
我知道这是一个相当古老的问题,但似乎没有一个明确的答案(尽可能多地)。我需要确定这个值,在*NIX框和Win X框上。也来自CLI执行的脚本和非CLI脚本。下面的函数是我想到的最好的函数,它借鉴了人们多年来谈到的不同概念。也许它有一些用处:
function getServerAddress() {
if(isset($_SERVER["SERVER_ADDR"]))
return $_SERVER["SERVER_ADDR"];
else {
// Running CLI
if(stristr(PHP_OS, 'WIN')) {
// Rather hacky way to handle windows servers
exec('ipconfig /all', $catch);
foreach($catch as $line) {
if(eregi('IP Address', $line)) {
// Have seen exec return "multi-line" content, so another hack.
if(count($lineCount = split(':', $line)) == 1) {
list($t, $ip) = split(':', $line);
$ip = trim($ip);
} else {
$parts = explode('IP Address', $line);
$parts = explode('Subnet Mask', $parts[1]);
$parts = explode(': ', $parts[0]);
$ip = trim($parts[1]);
}
if(ip2long($ip > 0)) {
echo 'IP is '.$ip."\n";
return $ip;
} else
; // TODO: Handle this failure condition.
}
}
} else {
$ifconfig = shell_exec('/sbin/ifconfig eth0');
preg_match('/addr:([\d\.]+)/', $ifconfig, $match);
return $match[1];
}
}
}
#5
3
If all else fails, you could always exec ipconfig or ifconfig, depending on your platform, and parse the result.
如果所有这些都失败了,您可以始终执行ipconfig或ifconfig,这取决于您的平台,并解析结果。