3

有没有办法使用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。

4

3 回答 3

7
gethostbyaddr(gethostbyname(gethostname()));

这将为我返回 FQDN,而其他所有内容都只返回 localhost 或主机名。

于 2018-05-10T18:25:28.240 回答
3

您可以使用以下...</p>

echo gethostbyaddr("127.0.0.1");

这可能会给您一个 FQDN,或者localhost(请参阅下面的原因)。

……但是

即使这可行,也不能保证,而且根本不是可移植的。

这是为什么?

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

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

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

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

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

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

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

于 2014-09-02T13:50:41.097 回答
1

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

gethostbyaddr('127.0.1.1');
于 2016-10-07T16:37:07.217 回答