Как получить текущее системное FQDN в php-cli?

Есть ли способ получить полное доменное имя текущей системы, используя 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 доза не существует (потому что только клиент)

Опять же, я знаю, что могу сделать это

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

Но для этой тривиальной задачи я думаю, что php должен был иметь встроенную функциональность для получения fqdn.

3 ответа

Решение

Вы можете использовать следующее...

echo gethostbyaddr("127.0.0.1");

Это может дать вам полное доменное имя, или localhost (см. ниже причину этого).

Но:

даже если это работает, это не гарантируется и не является переносимым.

Это почему?

То, что вы хотите, это в основном обратный поиск DNS для IP-адреса 127.0.0.1, Неважно, если вы используете hostname -f (если доступно в вашей реализации имени хоста) или gethostbyaddr("127.0.0.1")система должна всегда занимать преобразователь, чтобы найти полное доменное имя для IP-адреса.

Теперь, если у вас есть полное доменное имя для вашего IP-адреса в вашем /etc/hostsзатем распознаватель может найти полное доменное имя локально, в противном случае он должен выполнить обратный поиск DNS.

Это по замыслу, вы ничего не можете с этим поделать. Полностью квалифицированные доменные имена - это дело DNS, о которых никогда не должны были знать локальные хосты. Даже /etc/hosts вход больше взломать. (Хотя это обычный сервер, он нужен и многим почтовым серверам.)

Вот почему решение не переносимо: если ваше приложение развернуто на сервере, где нет полного доменного имени для 127.0.0.1 находится в /etc/hosts файл, то он просто вернет простое имя хоста.

И, очевидно, DNS-сервер не может дать вам доменное имя для поиска 127.0.0.1.

Есть небольшая разница между PHP gethostbyaddr('127.0.0.1') а также hostname -f: Реализация PHP берет имя, присвоенное 127.0.0.1, независимо от того, является ли FQDN или нет; hostname -f пытается найти в именах полное доменное имя и использует первое найденное.

shell_exec подход кажется правильным, но если вам нужно избегать команд оболочки, вы можете попробовать читать и анализировать /etc/hosts прямо в PHP; так как синтаксис довольно прост.

gethostbyaddr(gethostbyname(gethostname()));

Это возвращает мне полное доменное имя, а все остальное просто возвращает localhost или hostname.

Для конфигурации Debian по умолчанию fqdn можно получить с помощью:

gethostbyaddr('127.0.1.1');
Другие вопросы по тегам