3

php-cliを使用して現在のシステムの完全修飾ドメイン名を取得する方法はありますか?

私が探しているのは、ホスト名 -f が行っているのと同じことを取得する php 関数です。

$ 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

3

以下を使用できます…</p>

echo gethostbyaddr("127.0.0.1");

これにより、FQDN、またはlocalhost(この原因については以下を参照してください) が得られる場合があります。

しかし:

これが機能する場合でも、保証されておらず、移植性もまったくありません。

何故ですか?

必要なのは、基本的に IP アドレスの逆引き DNS ルックアップ127.0.0.1です。(ホスト名の実装hostname -fで利用可能な場合) またはを使用するかどうかは問題ではありません。システムは常にリゾルバーを占有して、IP アドレスの FQDN を見つける必要があります。gethostbyaddr("127.0.0.1")

に IP アドレスの FQDN エントリがある場合/etc/hosts、リゾルバーは FQDN をローカルで見つけることができます。それ以外の場合は、逆引き DNS ルックアップを行う必要があります。

これは仕様によるものであり、これについてはどうすることもできません。完全修飾ドメイン名は DNS の仕事であり、ローカル ホストはそれらについて知ることは想定されていませんでした。エントリでさえ/etc/hostsハックです。(一般的なものですが、多くのメール サーバーでも必要です。)

127.0.0.1そのため、このソリューションは移植可能ではありません。ファイルに FQDNが含まれていないサーバーにアプリケーションがデプロイされている場合/etc/hosts、単純なホスト名が返されます。

そして、明らかに、DNS サーバーは 127.0.0.1 ルックアップのドメイン名を提供できません。

gethostbyaddr('127.0.0.1')PHPとには少し違いがあります。PHP のhostname -f実装では、FQDN かどうかに関係なく、127.0.0.1 に割り当てられた最初の名前が使用されます。hostname -f名前から FQDN を見つけようとし、最初に見つかったものを使用します。

このshell_execアプローチは有効に見えますが、シェル コマンドを避ける必要がある場合は/etc/hosts、PHP で直接読み取りと解析を試すことができます。構文が非常に単純であるためです。

于 2014-09-02T13:50:41.097 に答える
1

Debian のデフォルト設定の場合、fqdn は次のコマンドで取得できます。

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