17.3. Протокол LDAP
LDAP (Lightweight Directory Access Protocol - облегченный протокол службы каталогов) - это универсальный метод хранения информации о каталогах, являющийся частичной реализацией стандарта X.500. Протокол LDAP был впервые описан в документах RFC 1777 и RFC 1778.
С помощью протокола TCP/IP клиенты могут получить доступ к централизованной адресной книге, содержащей контактную информацию, публичные ключи шифрования и другую подобную информацию. В Internet имеется множество серверов LDAP. На узле <http://www.dante.net/np/pdi.html> некоммерческая организация Dante ведет учет серверов LDAP, учрежденных в США. Полное обсуждение протокола LDAP выходит за рамки этой книги, но достаточно полную информацию о нем можно почерпнуть из Internet. Для начала можно ознакомиться с основными положениями проекта OpenLDAP на узле <http://www.openldap.org/>.
Функции, описанные в этом разделе, требуют компилирования поддержки LDAP при компиляции модуля PHP или загрузки модуля расширения с помощью dl. Модуль LDAP появился в результате плодотворного сотрудничества Эмитея Исаакса (Amitay Isaacs), Расмуса Лердорфа (Rasmus Lerdorf), Геррита Томпсона (Gerrit Thomson) и Эрика Варнке (Eric Warnke).
boolean ldap_add(resource connection, string dn, array entry)
Функция ldap_add (листинг 17.3) предназначена для добавления на уровне объекта записей в заданный DN (отличительное имя). Аргументом entry является массив значений атрибутов. Если атрибут может иметь несколько значений, то элемент массива сам становится массивом (обратите внимание на атрибут mail в листинге 17.3). Если необходимо добавить атрибуты на уровне атрибутов, воспользуйтесь возможностями, предоставляемыми функцией ldap_mod_add. 
Листинг 17.3. Функция ldapadd

<?php
// подключиться к серверу LDAP if(!($ldap=ldap_connect("localhost"))) {
die("Невозможно подключиться к серверу LDAP!");
}
//задать DN регистрации
$dn="cn=Manager,dc=leonatkinson,dc=com"; // попытка подключиться к DN с использованием пароля if(!ldap_bind($ldap, $dn, "secret"))
{
die("Невозможно связаться с '$dn'!"),-
}
// создать запись $entry["cn"]="Barry Bat"; $entry["objectClass"]="inetOrgPerson"; $entry["sn"]="Barry";
$entry["mail"][0] = "barry@example.com",-$entry["mail"][1] = "bat@example.com",-
$entry["initials"]="BB";
$entry["homePhone"]="123-123-1234"; $entry["mobile"]="123-123-1234"; // создать DN для новой записи $dn = "cn=Barry Bat,dc=leonatkinson,dc=com"; // добавить запись if(ldap_add($ldap, $dn, $entry))
{
print("Запись добавлена!");
}
else
{
print(" Ошибка операции добавления записи!");
}
// Закрыть соединение ldap_close($ldap);

boolean ldap_bind(resource connection, string dn, string password)
Функция ldap_bind предназначена для привязки каталога. Необязательные аргументы dn и password предназначены для идентификации. Обычно серверы требуют аутентификации для любой команды, изменяющей содержимое каталога.
boolean ldap_close(resource connection)
Функция ldap_close закрывает соединение с сервером каталога.
boolean ldap_compare(resource connection, string dn, string attribute, string value)
Функция ldap_compare сравнивает запись с заданным значением.
integer ldap_connect(string host, integer port)
Функция ldap_connect возвращает идентификатор соединения LDAP или значение FALSE в случае возникновения ошибки. Оба аргумента являются необязательными. Без аргументов ldap_connect функция возвращает идентификатор текущего открытого соединения. Если аргумент port не указан, работа ведется с портом 389.