【问题标题】:How can I get the server IP address using PHP from the CLI?如何从 CLI 使用 PHP 获取服务器 IP 地址?
【发布时间】:2011-01-21 07:08:10
【问题描述】:

标题几乎概括了它:

如何从 CLI 使用 PHP 获取服务器 IP 地址?

使用 PHP 的 CLI,$_SERVER 不包含服务器的 IP 地址,因此显而易见的解决方案是不可能的。

谢谢!

【问题讨论】:

    标签: php


    【解决方案1】:

    这段代码将获取*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'}"));
    

    【讨论】:

    • 请记住,如果设备通过 wi-fi 连接,则会失败。 stackoverflow.com/a/1814633/572660
    • ifconfig | grep -m1 'inet addr' | awk -F':' {'打印 $2'} | awk -F' ' {'print $1'} // 我的 ip 地址不在 eth0 上
    【解决方案2】:

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

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

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

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

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

    最重要的是,如果您对 $_SERVER['REMOTE_ADDR']$_SERVER['SERVER_ADDR'] 感兴趣,它根本不适用于 CLI 运行脚本。

    【讨论】:

    • 他们 (whatsmyip.org) 不喜欢什么? ipinfo.io 也值得一提。他们返回 JSON 响应。
    • @Taylan 他们不喜欢被用作自动请求的事实上的 API
    【解决方案3】:

    此时 PHP 不知道 IP,除非您 pass_thru() 或 exec() 像 ifconfig 这样的 shell 实用程序。为此,我建议您重新考虑使用 CLI。

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

    【讨论】:

      【解决方案4】:

      因为我在搜索时发现了这个,所以我很快就把它放在了一起。可以使用更好的错误检查等,但它可以完成工作。也许其他人会觉得它有用:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-05-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-07
            • 1970-01-01
            • 2014-07-03
            • 1970-01-01
            相关资源
            最近更新 更多