ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

Разработка отдельных фрагментов сайтов, консультации по вопросам верстки веб-страниц и веб-программирования.

Применение функций сетевого контроля

Применение функций сетевого контроля

PHP содержит набор функций "контроля", предназначенных для проверки информации об именах хостов, IP-адресах и почтовых обменах. Например, если создается справочный сайт, перед добавлением новых URL-адресов можно автоматически проверить правильность информации о хосте и контактной информации. Поступая таким образом, можно сэкономить пользователям немало усилий, чтобы в дальнейшем не оказалось, что сайт не существует или почтовый адрес некорректен.

directory_submit.html — HTML-код для формы ввода информации

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Отправте свой сайт</title>
</head>

<body>
<h1>Отправте сайт</h1>
<form action="directory_submit.php" method="post">
<table width="30%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>URL</td>
<td><input name="url" type="text" value="http://" size="30"></td>
</tr>
<tr>
<td>Адрес электронной почты</td>
<td><input name="email" type="text" size="30"></td>
</tr>
<tr>
<td> </td>
<td><input name="" type="submit" value="Отправить"></td>
</tr>
</table>
</form>
</body>
</html>

В окне веб-браузера это будет выглядеть так.

Форма ввода информации

После щелчка на кнопке Отправить в первую очередь необходимо убедиться, что URL-адрес размещен на реальной машине, и что хост почтового адреса тоже реален.

Сценарий, предназначенный для выполнения этих проверок, использует две функции из набора сетевых PHP-функций: gethostbyname() и dns_get_mx().

directory_submit.php —сценарий для проверки URL и почтового адреса

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Результаты передачи сайта</title>
</head>

<body>
<h1>Результаты передачи сайта</h1>
<?php
//Извлечение информации из полей формы
$url = $_REQUEST['url'];
$host = $_REQUEST['email'];
//Проверка URL
$url = parse_url($url);
$host = $url['host'];
if (!($ip = gethostbyname($host)))
{
echo 'Хост для данного URL не существует';
exit;
}
echo "IP-адрес хоста: $ip <br>";
//Проверка почтового адреса
$email = explode('@', $email);
$emailhost = $email[1];
//Внимание! Функция dns_get_mx() *не реализована* в Windows-версиях PHP
if(!dns_get_mx($emailhost, $mxhostsarr))
{
echo 'Хост почтового сервера не существует';
exit();
}
echo 'Почтовый сервер: ';
foreach ($mxhostsarr as $mx)
echo "$mx ";
//Если сценарий дошол до этой точки, значит все в порядке
echo '<br>Переданные данные корректны .<br>';
echo 'Спасибо за информацию о вашем сайте .<br>';
?>
</body>
</html>

После выполнения сценария в окно веб-браузера будет выведена информация о проверки имени хоста в URL и почтовом адресе.

Результаты передачи сайта

Рассмотрим наиболее интересные части сценария.

Вначале к заданному URL-адресу применяется функция parse_url(). Эта функция возвращает ассоциированный массив различных частей имени URL. Доступные порции информации включают в себя протокол в себя протокол (scheme), пользователя (user), пароль (pass), хост (host), порт (port), путь (path), запрос (query), и фрагмент (fragment). Обычно требуются не все эти элементы, но мы сейчас рассмотрим, как из них формируется URL.

Если задан следующий URL-адрес:

http://nobody:secret@example.com:80/script.php?varaible=value#anchor

то значения каждой части массива будут следующими:

  • Протокол: http://
  • Пользователь: nobody
  • Пароль: secret
  • Хост: example.com
  • Порт: 80
  • Путь:script.php
  • Запрос: variable=value
  • Фрагмент: anchor

В сценарии directory_submit.php требуется только информация о хосте, поэтому она извлекается из массива следующим образом:

$url = parse_url($url);
$host = $url['host'];

После этого с помощью функции gethostbyname() можно получить IP-адрес хоста, если он известен службе имен доменов (domain name service — DNS). Функция возвращает IP-адрес, если он существует, или false в противном случае:

$ip = gethostbyname($host)

Можно и наоборот: функция gethostbyaddr() по IP-адресу хоста возвращает его символьное имя. Если применять две эти функции одну за другой, то может получиться имя хоста, отличное от исходного. В этом случае сайт, видимо, использует службу виртуального хостинга, когда одна физическая машина и один IP-адрес обслуживает несколько доменов.

Если искомый URL является допустимым, мы переходим к проверке почтового адреса. Вначале он с помощью функции explode() разбивается на имя пользователя и имя хоста:

$email = explode('@', $email);
$emailhost = $email[1];

Имея имя хоста, несложно проверить, можно ли на него отправить почту. Это делается с помощью функции dns_get_mx():

dns_get_mx($emailhost, $mxhostsarr);

Эта функция возвращаеет для заданного адреса набор MX-записей (Mail Exchange —почтовый обмен) в массиве, заданном переменной $mxhostsarr.

MX-запись хранится на DNS-серверах, и ее проверка выполняется так же, как проверка имени хоста. Машина, указанная в MX-записи, не обязательно является той же, куда поступит почта. Однако она знает, куда необходимо перенаправлять почту. Машин может быть несколько, поэтому функция возвращает массив, а не одну строку с именем хоста. Если в DNS нет записи для данного хоста, значит, почту туда отправить невозможно.

Обратите внимание, что функция dns_get_mx() не реализована в Windows-версиях PHP. Если вы работаете под управлением Windows, то должны пользоваться пакетом PEAR::Net_DNS, который обеспечит аналогичную функциональность.

Если все проверки завершаются успешно, данные можно разместить в база данных для последующего просмотра кем-либо из сотрудников, обслуживающих справочный сайт.

В дополнение к упомянутым функциям можно использовать общую функцию checkdnsrr(), которая для имени хоста возвращает значение true, если это имя присутствует в DNS.