Как получить текущее системное 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');