Я пытаюсь использовать свой поиск ldap, он работает, однако каждый поисковый запрос занимает около 10-20 секунд, чтобы дать мне результаты. Хотя мне приходится работать примерно с 50 000 записей (пользователей) в моем активном каталоге, и вы бы сказали, неудивительно, что это занимает так много времени, поскольку ldap_search равен O(N), я не поверю, что на это действительно нужно так много времени.
У меня есть текстовое поле, где я могу вводить имена. После третьей набранной буквы функция поиска срабатывает и передает textbox.value в качестве параметра в файл PHP ниже (через AJAX).
<?php
error_reporting(E_ERROR | E_PARSE);
if(filter_input_array(INPUT_POST))
{
$term = filter_input(INPUT_POST, 'term');
$username = 'username';
$password = "password";
$ldap_host = array('host1', 'host2', 'host3');
$ldap_base_dn = "baseDN";
foreach ($ldap_host as $host)
{
$connect = ldap_connect($host);
if($connect)
{
break;
}
if(!$connect && $host == end($ldap_host))
{
exit(">> Could not connect to any of the given LDAP servers. <<");
}
}
ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);
ldap_set_option($connect, LDAP_OPT_SIZELIMIT, 20);
$bind = ldap_bind($connect, $username, $password);
$search_filter = '(&(objectClass=person)(cn=*'.$term.'*))';
$attributes = array();
$attributes[] = 'givenname';
$attributes[] = 'mail';
$attributes[] = 'samaccountname';
$attributes[] = 'sn';
$attributes[] = 'cn';
$result = ldap_search($connect, $ldap_base_dn, $search_filter, $attributes);
$ArrayOfHumanoids = array();
if (FALSE !== $result)
{
$entries = ldap_get_entries($connect, $result);
for ($i = 0; $i < $entries['count']; $i++)
{
if (!empty($entries[$i]['givenname'][0]) &&
!empty($entries[$i]['mail'][0]) &&
!empty($entries[$i]['samaccountname'][0]) &&
!empty($entries[$i]['sn'][0]) &&
'Shop' !== $entries[$i]['sn'][0] &&
'Account' !== $entries[$i]['sn'][0])
{
$ad_users[strtoupper(trim($entries[$i]['samaccountname'][0]))] = array('email' => strtolower(trim
($entries[$i]['mail'][0])), 'first_name' => trim($entries[$i]['givenname'][0]), 'last_name' => trim($entries[$i]
['sn'][0]));
array_push($ArrayOfHumanoids, $entries[$i]['cn'][0] . "+");
}
}
}
if(count($ArrayOfHumanoids) == 0)
{
echo "<div>Sorry, no match found!<br></div>";
}
else
{
foreach($ArrayOfHumanoids as $userVar)
{
echo $userVar;
}
}
ldap_unbind($connect);
}
?>
$term — это параметр поиска, который я передаю при каждом нажатии клавиши. В функции обратного вызова AJAX, как вы видите, я возвращаюсь с ArrayOfHumanoids, который обратный вызов json получает и разбивает на строку +. У меня нет проблем с этой частью. Я просто не понимаю, почему это так медленно. Я новичок в LDAP или рекурсии. Заранее спасибо, буду рад любым советам!