2010-02-26 155 views

回答

7

问题是,在CLI上运行PHP时,没有涉及任何网络活动,因此没有IP地址。你需要首先定义的是,你想得到什么 IP。

  • 运行脚本的客户端的IP?
    不可能,因为没有“客户端”。

  • 网络接口的本地IP?
    运行一些系统实用程序,如ifconfig,但如果服务器具有多个网络接口,则可能会获得多个IP。

  • IP的a域,它可能对应于您正在运行的服务器?
    使用gethostbyname(),但你需要知道你想查询哪个域。

  • 面向公众所在的网络/服务器的IP?
    你需要使用像www.whatsmyip.org这样的外部服务(注意他们不喜欢这样),它会告诉你你的请求来自哪个IP。这个地址是否对应于任何有用的东西是另一个话题。

底线是,如果你有兴趣在$_SERVER['REMOTE_ADDR']$_SERVER['SERVER_ADDR'],它根本不适用于CLI运行脚本。

+0

他们(whatsmyip.org)不喜欢什么?另外[ipinfo.io](http://ipinfo.io)值得一提。他们返回JSON响应。 – Taylan

3

此时,PHP不知道IP,除非你使用了pass_thru()或exec()这样的shell工具,如ifconfig。我建议你为此重新考虑使用CLI。

在这种情况下,将PHP CLI视为“基本解释器”。

0

我假设你在通过PHP处理连接时调用PHP CLI脚本。如果是这种情况,可以将$ _SERVER的值作为命令行参数传递给CLI脚本。

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); 
    } 
} 
12

这一点代码将获得* 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'}")); 
+0

有点破解,但确实有效。 – nickhar

+0

请记住,如果设备通过Wi-Fi连接,将会失败。 http://stackoverflow.com/a/1814633/572660 –

+0

ifconfig | grep -m1'inet addr'| awk -F':'{'print $ 2'} | awk -F''{'print $ 1'} //我的IP地址不在eth0上 – zzapper

0

虽然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;