В самом классе отсутствует какое-либо постоянное кэширование ответов службы DNS, из чего следует, что сценарии, выполняющиеся в CGI-версии РНР, не выиграют от механизма кэширования, поскольку каждый раз класс создается заново. Кроме того, поскольку наша задача носит скорее иллюстративный характер, мы не будем реализовывать никакой семантики устаревания кэша. В реальном клиенте DNS должен присутствовать разумный механизм поддержки сроков действия кэша:
<?php
class Resolver {
Следующие переменные представляют различные ассоциативные массивы, используемые для кэширования ответов на запросы:
var $ho,stName; var SdomainName; var SipAddress;
var
var SservPort; var SipDotted; var SprotoNumber;
var $protoName; var SipLong;
Конструктор просто инициализирует массивы:
function ResolverO {
j resetCacheQ;
Этот метод получает данные о почтовом ретрансляторе для заданного домена:
function getMx($domain) {
Если значение кэшировано, возвращаем его, не вызывая функцию getmxrr():
if (!$domain) {
loggerг("Domain name is required to retrieve MX records"); return -1;
} elseif (($ret = $mailXchanger[$domain])) {
return $ret;
Если нет значения в кэше, вызываем функцию getmxrr(), чтобы получить ответ и поместить результат в кэш:
} elseif (getmxrr($domain, ImailXchanger) == false) { log_err("MX records could not be found found for " , SdomainName);
return -1; } else {
$domainName[$domain] = ImailXchanger; return ImailXchanger;
I
i
Этот метод возвращает IP-адрес по заданному имени хоста:
function getlpAddress(Shost) {
Как и в методе мы пытаемся найти предыдущий ответ на этот за
прос, а если это не удается, выполняем вызов функции gethostbynamel() и кэ- шируем результат:
if (!$host) {
log_err("Host name is required to find IP addresses");
return -1;
} elseif ((Sret = $ipAddress[$host])) { return $ret;
} elseif (($ret =gethostbynamel(Shost)) == false) {
log_err("IP address could not be found found for " . $host); return -1; } else {
SipAddress[$host] = $ret; $hostName[$ret] = $.host; return $ret;
}
)
Этот метод возвращает имя хоста по данному IP-адресу:
function getHostName($ipAddr)
{
Он проверяет формат IP-адреса:
if ($ipAddr != О &&
!ereg("[0-254]\.[0-254]\.[0-254]\,[0-254]", SipAddr)) {
Остальные методы применяют ту же стратегию кэширования ответов:
log_err( "Incorrect IP address format"); return -1;
elseif (($ret = $hostName[$ipAddr])) { return $ret;
} elseif (($ret = gethostbyaddr($ipAddr)) == false) {