标题几乎总结了:
如何从CLI使用PHP获取服务器IP地址?
使用PHP的CLI,$ _SERVER不包含服务器的IP地址,因此显而易见的解决方案是不可能的。
谢谢!
答案 0 :(得分:13)
这段代码将获得* 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'}"));
答案 1 :(得分:7)
问题是,在CLI上运行PHP时,不涉及任何网络活动,因此没有IP地址。您首先需要定义的是,您希望获得的 IP。
运行脚本的客户端的IP?
不可能,因为没有“客户”。
网络接口的本地IP?
运行一些系统实用程序,如ifconfig
,但如果服务器有多个网络接口,则可能会获得多个IP。
域的IP,可能与您正在运行的服务器对应也可能不对应?
使用gethostbyname()
,但您需要知道要查询的域。
您所在网络/服务器的面向公众的IP? 您需要使用外部服务,例如www.whatsmyip.org(请注意,他们不喜欢这样),它会告诉您您的请求来自哪个IP。这个地址是否与任何有用的东西相对应是一个不同的主题。
底线是,如果您对$_SERVER['REMOTE_ADDR']
或$_SERVER['SERVER_ADDR']
感兴趣,则它根本不适用于CLI运行的脚本。
答案 2 :(得分:3)
此时PHP不知道IP,除非pass_thru()或exec()像ifconfig这样的shell实用程序。我建议您重新考虑使用CLI来实现此目的。
在这种情况下,将PHP CLI视为“基本解释器”。
答案 3 :(得分:1)
因为我在搜索时找到了这个,所以我快速整理了这个功能。可以使用更好的错误检查等,但它完成了工作。也许其他人会发现它很有用:
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);
}
}
答案 4 :(得分:0)
我假设您在通过PHP处理连接时调用PHP CLI脚本。如果是这种情况,您可以将$ _SERVER的值作为命令行参数传递给CLI脚本。
答案 5 :(得分:0)
虽然vrillusions帖子很棒,但有一个更好的方法可以做到这一点,原因有两个:(a)源页面可能并不总是只留下ip no buts(他们最近修改了索引以获得html),而我们可以只需指向机器人的/ s,就可以更容易地使用正则表达式来匹配页面上的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;