PHP и DNS
Автор: IT-студия SoftTime (softtime.ru)
В этой статье мы рассмотрим функции, которые
предоставляет PHP для работы с DNS серверами. Наиболее часто возникает
задача получения имени хоста по его IP-адресу, другие задачи встречаются
значительно реже.
Функция gethostbyname
Синтаксис:
string gethostbyname(string
hostname)
Пример использования фунции gethostbyname
<?
$hostname = "localhost";
$ip_address = gethostbyname($hostname);
echo
("IP-адрес $hostname: $ip_address");
?>
Функция gethostbynamel
string gethostbynamel(string
hostname)
Многие компьютеры имеют несколько IP-адресов, особенно
типична такая ситуация для различных серверов. Получить полный список
IP-адресов, соответствующих данному имени компьютера, можно с помощью
функции gethostbynamel, действующей аналогично функции gethostbyname.
Другая ситуация, в которой полезно применение этой функции, возникает,
когда одно имя DNS соответствует нескольким компьютерам. Это бывает при
работе с DNS серверами, поддерживающими механизм кругового
распределения нагрузки, при котором одно имя DNS сервера отображается
на несколько компьютеров в локальной сети этого сервера.
Возвращаемый список IP-адресов функция gethostbynamel
помещает в массив:
<?
$hostname = "localhost";
$ip_addresses = gethostbyname($hostname);
echo("The IP adresses of '$hostName' are:
<br>\n");
foreach($ip_adresses as $index => $val)
{
echo("$val");
}
?>
Функция gethostbyaddr
Эта функция принимает в качестве аргумента IP-адрес и
возвращает соответствующее ему имя хоста:
<?
$ip_address = "127.0.0.1";
$hostname = gethostbyaddr ($ip_address);
echo
("Имя хоста с IP-адресом $ip_address:
$hostname");
?>
Функция checkdnsrr
string checkdnsrr(string
hostname [, string type])
DNS сервер сохраняет немало полезной информации о хосте,
для чего используются так называемые записи ресурсов, которые имеют
следующие типы:
- A (Запись содержит IP-адрес хоста);
- CNAME (Запись содержит псевдоним хоста);
- NS (Запись содержит имя DNS-сервера, являющегося авторитетным для
поддо-мена. Авторитетным является такой DNS-сервер, который замыкает
цепочку DNS-запросов);
- МХ (Запись содержит Имя хоста почтового ретранслятора в домене,
которому принадлежит данный хост. В этой записи также хранится значение
коэффициента предпочтения для почтового ретранслятора);
- PTR (Запись хранит отображения IP-адресов в имена).
Функция checkdnsrr находит на DNS-сервере записи ресурсов
вида type для хоста hostname
Примечание: Эта функция не поддерживается на
Windows-платформах.
Функция getmxrr
string getmxrr(string hostname,
array mxhost, [, array weight])
Эта функция принимает в качестве аргумента имя хоста hostname
в данном домене и заполняет массив mxhost
списком почтовых ретрансляторов этого домена. Если
указан третий необязательный аргумент weight
, то функция
заполняет его значениями предпочтения, которые возвращает ей почтовый
ретранслятор
Функция getmxrr
является достаточно
полезной. Дело в том, что когда требуется послать сообщения по адресу
username@someserver.com, необходимо сначала узнать хост почтового
ретранслятора для домена someserver.com, а затем получить его IP-адрес.
После этого можно соединяться с хостом для доставки почты. В домене может
быть несколько почтовых ретрансляторов с разными значениями предпочтения,
поэтому, получив список ретрансляторов, имеет смысл устанавливать
соединение с тем из них, который имеет максимальное значение
предпочтения.
В следующем листинге показан пример кода, с помощью
которого можно получить список почтовых ретрансляторов:
Получение списка почтовых ретрансляторов
<?
$domain = "server.com";
getmxrr($domain, $maillist, $priority);
echo("Список почтовых ретрансляторов хоста $domain:
\n");
for($i = 0; $i < count($maillist); ++$i)
{
echo("$maillist[$i] = $priority[$i]
\n");
}
?>
Проверка существования адреса электронной
почты
Заметим сразу, что речь идет не о проверке адресов с
помощью регулярного выражения, а о проверке существования хоста почтового
ретранслятора для некоторого домена. Т.е. приведенный выше код можно
практически не перерабатывая приспособить для проверки существования
e-mail адреса:
<?
$email_arr = explode("@" , $email);
$host = $email_arr[1];
if (!getmxrr($host, $mxhostsarr))
{
echo "На адрес $email отправка
почты невозможна";
exit;
}
getmxrr($host, $mxhostsarr, $weight);
echo "На $email письма
могут отправляться через следующие хосты:
";
for ($i=0; $i < count($mxhostsarr); $i++)
{
echo
("$mxhostsarr[$i] = $weight[$i]
");
}
?>