标题几乎概括了一切:
如何使用 PHP 从 CLI 获取服务器 IP 地址?
使用 PHP 的 CLI,$_SERVER 不包含服务器的 IP 地址,因此显然的解决方案是不可能的。
谢谢!
这段代码将获取 *nix 系统上接口“eth0”的 IP 地址。
// get the local hosts ip address
$hostsipaddress = str_replace("\n","",shell_exec("ifconfig eth0 | grep 'inet addr' | awk -F':' {'print $2'} | awk -F' ' {'print $1'}"));
问题是,在 CLI 上运行 PHP 时,不涉及任何网络活动,因此没有 IP 地址。您首先需要定义的是,您想要获得什么IP。
运行脚本的客户端IP?
不可能,因为没有“客户”。
网络接口的本地IP?
运行一些系统实用程序,例如
ifconfig
,但如果服务器有多个网络接口,您可能会获得多个 IP。a域的IP,它可能对应也可能不对应于您正在运行的服务器?
使用
gethostbyname()
,但您需要知道要查询哪个域。您所在网络/服务器的面向公众的 IP?
您需要使用像 www.whatsmyip.org 这样的外部服务(请注意,他们不喜欢这样),它会告诉您您的请求来自哪个 IP。这个地址是否对应任何有用的东西是另一个话题。
底线是,如果您对
$_SERVER['REMOTE_ADDR']
或 $_SERVER['SERVER_ADDR']
感兴趣,它根本不适用于 CLI 运行的脚本。
此时 PHP 不知道 IP,除非您 pass_thru() 或 exec() 像 ifconfig 这样的 shell 实用程序。我建议您重新考虑使用 CLI 来实现此目的。
在这种情况下,将 PHP CLI 视为“基本解释器”。
因为我在搜索时发现了这个,所以我很快就把这个功能放在了一起。 可以使用更好的错误检查等,但它可以完成工作。也许其他人会发现它有用:
function get_external_ip() {
$ch = curl_init("http://icanhazip.com/");
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
if ($result === FALSE) {
return "ERROR";
} else {
return trim($result);
}
}
我假设您在通过 PHP 处理连接时调用 PHP CLI 脚本。 如果是这种情况,您可以将 $_SERVER 的值作为命令行参数传递给 CLI 脚本。
虽然 vrillusions 帖子很棒,但有一个更好的方法可以做到这一点,因为有两个原因(a)源页面可能并不总是只保留 ip,但是(他们最近修改了索引以包含 html),而我们现在可以指出对于机器人来说,使用 regex 来匹配页面上的 ip 并将其拉出会更容易。这是我想象的功能
function RemoteIP($source = 'http://canihazip.com'){
$c = file_get_contents($source);
$ip = false;
if(preg_match('/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/', $c, $m)){
$ip = $m[1];
}
return $ip;
}
print RemoteIP().PHP_EOL;
最好的方法:
trim(shell_exec("ifconfig eth0 | grep -oP 'inet \K[\d.]+'"));