在php-cli中如何获取当前系统的FQDN?

4
有没有一种使用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环境)

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

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

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

11
gethostbyaddr(gethostbyname(gethostname()));

这会为我返回完全限定域名(FQDN),而其他所有内容都只会返回本地主机名或主机名。


3

You can use the following …

echo gethostbyaddr("127.0.0.1");

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

但是

即使这样可以工作,也不能保证,并且根本不具备可移植性。

为什么呢?

你想要的基本上是针对IP地址127.0.0.1进行的反向DNS查找。无论你使用hostname -f(如果在你的hostname实现中可用)还是gethostbyaddr(“127.0.0.1”),系统必须始终占用解析器以查找IP地址的FQDN。

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

这是按设计来的,你无法改变它。完全限定域名是DNS的业务,本地主机永远不应该知道它们。即使/etc/hosts条目更像是一种hack。(虽然是常用的,许多邮件服务器也需要它。)

这就是为什么解决方案不具备可移植性的原因:如果您的应用程序部署在没有/etc/hosts文件中为127.0.0.1设置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文件;因为语法非常简单。


我在“hostname”上没有“-f”标志,所以我猜每台机器上也不会有。 - Smar
长版本是“--fqdn”,但可能只存在于Debian实现中。无论如何,因为通常你会在CLI上使用类似于“dig”的东西来进行DNS查询,所以这并不重要。 - lxg
是的,这里也没有。但是dig也不是默认安装的,所以基于这一点,我会更倾向于你的答案而不是那两个。 - Smar
感谢您的详细回答! gethostbyaddr(“ 127.0.0.1”)给了我localhost。所以我会坚持使用shell_exec(),它给我所需的结果。我将始终在那里使用debian,所以没问题。至少现在我明白为什么是这样的了。 :) - wormhit
是的,我之前不知道 gethostbyaddr('127.0.0.1')hostname -f 之间的区别。我已经相应地更新了帖子,在末尾添加了两段内容。 - lxg

1

对于Debian默认配置,可以使用以下命令获取完全限定域名(FQDN):

gethostbyaddr('127.0.1.1');

它确实有效。起初,我以为这只是一个重复的答案,因为我没有注意到IP地址不是127.0.0.1而是127.0.1.1... - Tristan CHARBONNIER

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接