Whois сервис на PHP

Чтобы организовать свой Whois сервис на PHP необходимо создать базу доменов и их Whois-серверов, с которых можно прочитать информацию по домену. Информацию для БД по доменам первого уровня ccTLD, gTLD, IDN (com, net, ru, ua и др) можно взять тут: www.iana.org.

База данных MySQL для доменов
CREATE TABLE `whois_service`.`table_domain_z` (
`id` INT UNSIGNED NOT NULL ,
`parent` INT UNSIGNED NOT NULL ,
`domain_name` CHAR( 50 ) NOT NULL ,
`whois_server` CHAR( 100 ) NOT NULL ,
PRIMARY KEY ( `id` ) ,
INDEX ( `parent` , `domain_name` )
) ENGINE = MYISAM ;
PHP-cкрипт извлечения информации для БД доменов первого уровня с www.iana.org
$file_cont = file_get_contents('http://www.iana.org/domains/root/db/');
$pattern = '!\<a href\=\"\/domains\/root\/db\/([a-z0-9а-я\-]{1,50})\.html\"\>\.(.*)\<\/a\>!i';
preg_match_all($pattern, $file_cont, $match);
$mysql_insert = '';
foreach ($match[1] AS $val)
  {
  $domain_to_db = mysql_real_escape_string($val);
  $mysql_insert .= '(null, 1, "'.$domain_to_db.'"),';
  }
$mysql_insert = substr($mysql_insert, 0, strlen($mysql_insert) - 1);
// ...
// Строки подключения к БД MySQL
// ...
mysql_query('INSERT INTO table_domain_z (id, parent, domain_name) VALUES '.$mysql_insert);

IDN-домены записываются скриптом в кодировке Punycode

Теперь необходимо прописать в БД ссылки на whois-сервисы каждой доменной зоны первого уровня. Большую часть этой информации можно узнать тут: whois.iana.org. Для тех доменных зон, у которых остутствует собственный whois-сервер, записываем whois.iana.org.

PHP-скрипт извлечения информации о whois-серверах доменов первого уровня
$query = 'SELECT id, name
          FROM table_domain_z
          WHERE whois_server = ""
          LIMIT 5'
;
$result = mysql_query($query);

$whois_search_txt = 'whois:';
$whois_strlen = strlen($whois_search_txt);
 
while ($row = mysql_fetch_assoc($result))
  {
  $con = @fsockopen('whois.iana.org', 43, $errno, $errstr, 5);
  if ($con)
    {
    $whois_server = '';
    fputs($con, $row['name']."\r\n");
    while(!feof($con))
      {
      $response = fgets($con, 128);
      if (strstr($response, $whois_search_txt))
        $whois_server = trim(substr($response, $whois_strlen));
      }

    $whois_server = (empty($whois_server))? 'whois.iana.org' : $whois_server;

    $query = 'UPDATE table_domain_z
              SET whois_server = "'
.mysql_real_escape_string($whois_server).'",
              WHERE id = '
.$row['id'];
    $result_upd = mysql_query($query);
    }
  }

Поскольку каждый whois имеет свои ограничения по кол-ву запросов за определенное время, не стоит за 1 раз отсылать множество запросов. На момент написаня статьи существовало чуть более 300 доменов первого уровня, и если не спеша обновлять страницу, запускающую скрипт извлечения информации о whois-серверах доменов первого уровня, то за пару минут БД будет заполнена необходимой информацией. Конечно, если whois необходимо вермя от времени обновлять, то лучше всего запускать подобный скрипт с помощью журнала заданий (cron).

Далее уже не составит труда написать клиентскую часть whois-сервиса.


// ...
// Проверка данных формы и whois-сервера для запрашиваемой зоны
// ...

$con = @fsockopen($row['whois_server'], 43, $errno, $errstr, 5);
if ($con)
  {
  $response = '';
  fputs($con, $_POST['domain_name']."\r\n");
  while(!feof($con))
    {
    $response .= fgets($con, 128);
    }
  }

// ...
// Вывод результатов
// ...
 

Опубликовано: 2011/06/18
HTML-код ссылки на эту страницу:
<a href="https://petrenco.com/php.php?txt=63" target="_blank">Whois сервис на PHP</a>
12317
Добавить комментарий
Ваш e-mail: (не виден посетителям сайта)
Ваше имя:
Комментарий:
Символы с картинки:
Только выделенные поля формы добавления комментариев обязательны к заполнению.