标题几乎总结了它:如何从CLI获取使用PHP的服务器IP地址?
我怎样才能从CLI使用PHP获得服务器的IP地址?
使用PHP的CLI,$ _SERVER不包含服务器的IP地址,所以明显的解决方案是不可能的。
谢谢!
标题几乎总结了它:如何从CLI获取使用PHP的服务器IP地址?
我怎样才能从CLI使用PHP获得服务器的IP地址?
使用PHP的CLI,$ _SERVER不包含服务器的IP地址,所以明显的解决方案是不可能的。
谢谢!
问题是,在CLI上运行PHP时,没有涉及任何网络活动,因此没有IP地址。你需要首先定义的是,你想得到什么 IP。
运行脚本的客户端的IP?
不可能,因为没有“客户端”。
网络接口的本地IP?
运行一些系统实用程序,如ifconfig
,但如果服务器具有多个网络接口,则可能会获得多个IP。
IP的a域,它可能对应于您正在运行的服务器?
使用gethostbyname()
,但你需要知道你想查询哪个域。
面向公众所在的网络/服务器的IP?
你需要使用像www.whatsmyip.org这样的外部服务(注意他们不喜欢这样),它会告诉你你的请求来自哪个IP。这个地址是否对应于任何有用的东西是另一个话题。
底线是,如果你有兴趣在$_SERVER['REMOTE_ADDR']
或$_SERVER['SERVER_ADDR']
,它根本不适用于CLI运行脚本。
此时,PHP不知道IP,除非你使用了pass_thru()或exec()这样的shell工具,如ifconfig。我建议你为此重新考虑使用CLI。
在这种情况下,将PHP CLI视为“基本解释器”。
我假设你在通过PHP处理连接时调用PHP CLI脚本。如果是这种情况,可以将$ _SERVER的值作为命令行参数传递给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);
}
}
这一点代码将获得* 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'}"));
虽然vrillusions后是伟大的存在是为了做有两个原因(一)来源网页可能无法始终保持刚才的IP没有但是这更好的方法(他们最近修改了指数有HTML)现在,虽然我们可以指向bot的/ 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;
他们(whatsmyip.org)不喜欢什么?另外[ipinfo.io](http://ipinfo.io)值得一提。他们返回JSON响应。 – Taylan