Arhn - архитектура программирования

Функция поиска LDAP очень медленная

Я пытаюсь использовать свой поиск 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 или рекурсии. Заранее спасибо, буду рад любым советам!

23.05.2014

  • Это поиск или подключение, которое занимает много времени? 23.05.2014
  • Мне тоже интересно. Поиск, я думаю, но я не могу разделить 2, потому что, если я хочу искать, я должен сначала подключиться. 23.05.2014
  • Не используйте ajax, обращайтесь к странице напрямую, используйте эхо до и после соединения, посмотрите, не в этом ли проблема? Также установите параметр отладки ldap, чтобы получить дополнительную информацию: ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7); 23.05.2014
  • Как я должен использовать его без AJAX? Я имею в виду, что значение textBox должно отправляться при каждом нажатии клавиши, и я могу сделать это только с помощью события js onkey*. И я не могу с этим вызвать функцию SearchNames(). 23.05.2014
  • Откройте вкладку сети в веб-инспекторе, найдите вызов ajax, щелкните правой кнопкой мыши, выберите «Открыть ссылку в новом окне». 23.05.2014
  • Хорошо, я удалил все строки поиска и просто позволил соединению сделать свою работу, повторив до, после, как вы сказали. Только подключение заняло секунд 5-6-7. :о 23.05.2014

Ответы:


1

Хорошо, я узнал, что вызвало проблему. Я изменил хосты на IP-адреса вместо фактического URL-адреса, теперь это намного быстрее, правда. Спасибо Ohgodwhy за указание на то, что проблема была в соединении, а не в поиске.

23.05.2014
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..