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

最佳答案

您可以使用以下...

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 文件中没有 /etc/hosts 的 FQDN 的服务器上,那么它只会返回简单的主机名。

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

PHP 的 gethostbyaddr('127.0.0.1')hostname -f 之间有一点区别:PHP 实现采用分配给 127.0.0.1 的名字,无论是否为 FQDN; hostname -f 尝试在名称中查找 FQDN 并使用它找到的第一个。
shell_exec 方法似乎有效,但如果您需要避免使用 shell 命令,您可以尝试直接在 PHP 中读取和解析 /etc/hosts;因为语法很简单。

关于php - 如何在 php-cli 中获取当前系统 FQDN?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25621068/

10-12 06:58