【问题标题】:How to get current system FQDN in php-cli?如何在 php-cli 中获取当前系统的 FQDN?
【发布时间】:2014-09-02 10:20:31
【问题描述】:

有没有办法使用 php-cli 检索当前系统完全合格的域名

我正在寻找的是 php 函数来检索与 hostname -f 所做的相同的事情:

$ hostname -f  #returns needed: system01.dev.lan

我尝试了以下操作:

php_uname('n') // returns: system01
gethostname() // returns: system01
gethostbyname(gethostname()) // returns ip address
gethostbyname(gethostname() . '.') // returns system01

$_SERVER 不存在(因为只有 cli env)

再次,我知道我可以做到这一点

php -r "var_dump(shell_exec('hostname -f'));"

但是对于这个微不足道的任务,我认为 php 应该内置功能来检索 fqdn。

【问题讨论】:

    标签: php command-line-interface fqdn


    【解决方案1】:
    gethostbyaddr(gethostbyname(gethostname()));
    

    这将为我返回 FQDN,而其他一切都只返回 localhost 或主机名。

    【讨论】:

      【解决方案2】:

      您可以使用以下...

      echo gethostbyaddr("127.0.0.1");
      

      这可能会给你一个 FQDN,或localhost(原因见下文)。

      但是

      即使这样有效,也不能保证,而且根本不便携。

      这是为什么呢?

      您想要的基本上是对 IP 地址127.0.0.1反向 DNS 查找。无论您使用hostname -f(如果在您的主机名实现中可用)还是gethostbyaddr("127.0.0.1"),系统都必须始终占用解析器来查找IP地址的FQDN。

      现在,如果您的/etc/hosts 中有您的 IP 地址的 FQDN 条目,则解析器能够在本地找到 FQDN,否则它必须进行反向 DNS 查找。

      这是设计使然,您无能为力。完全限定域名是 DNS 的业务,本地主机永远不应该知道它们。甚至/etc/hosts 条目也更像是一种黑客攻击。 (虽然很常见,但很多邮件服务器也需要它。)

      这就是解决方案不可移植的原因:如果您的应用程序部署在127.0.0.1 的 FQDN 不在/etc/hosts 文件中的服务器上,那么它只会返回简单的主机名。

      而且,很明显,DNS 服务器无法为您提供 127.0.0.1 查找的域名。

      PHP 的gethostbyaddr('127.0.0.1')hostname -f 有一点区别:无论是否为FQDN,PHP 实现都采用分配给127.0.0.1 的名字; hostname -f 尝试在名称中查找 FQDN 并使用它找到的第一个。

      shell_exec 方法似乎有效,但如果您需要避免使用 shell 命令,您可以尝试直接在 PHP 中读取和解析 /etc/hosts;因为语法很简单。

      【讨论】:

      • 我在hostname 上没有-f 标志,所以我想这也不会出现在每台机器上。
      • 长版本是--fqdn,但可能只存在于 Debian 实现中。无论如何都没关系,因为通常您会在 CLI 上使用 dig 之类的东西进行 DNS 查询。
      • 是的,这也不在这里。但是默认情况下也没有真正安装 dig,所以基于此,我真的会同意你对这两个的回答。
      • 感谢您的明确回答! gethostbyaddr("127.0.0.1") 给了我本地主机。所以我坚持使用 shell_exec() 给我需要的结果。我将永远有debian,所以没关系。至少现在我明白为什么会这样了。 :)
      • 是的,我不知道gethostbyaddr('127.0.0.1')hostname -f 之间的区别。我相应地更新了帖子,请参阅最后添加的两段。
      【解决方案3】:

      对于 debian 默认配置,可以通过以下方式检索 fqdn:

      gethostbyaddr('127.0.1.1');
      

      【讨论】:

      • 它确实有效。起初,我以为这只是一个重复的答案,因为我没有注意到 IP 地址不是 127.0.0.1 而是 127.0.1.1...
      猜你喜欢
      • 2010-09-14
      • 1970-01-01
      • 2017-09-15
      • 2013-08-23
      • 1970-01-01
      • 2011-07-02
      • 2016-07-30
      • 2016-02-01
      • 2014-04-21
      相关资源
      最近更新 更多