2009-12-03 10 views
3

Nous sommes en train de passer d'un ancien service d'annuaire propriétaire à OpenLDAP. Aujourd'hui, nous avons rencontré le problème que ldap_search_ext_s ou ldapsearch en général ne renvoie aucun résultat, si le nombre d'entrées, qui devaient être retournés par la recherche en cours, atteindrait une certaine limite. Malheureusement, définir la limite de taille plus haut dans la configuration du serveur LDAP pourrait simplement retarder le problème, car nous avons une très grosse base de données et notre mécanisme de mise à jour, qui s'exécute tous les matins, doit effectuer d'énormes requêtes.Paged ldap_search dans OpenLDAP pour contourner la limite de taille?

Dans la documentation MSDN j'ai remarqué qu'il existe un mécanisme pour effectuer un paged search, ce qui me permettrait de contourner la limitation de taille. Apparemment, cela est également spécifié dans un RFC draft from 1996 mais n'a pas encore été finalisé?

Quoi qu'il en soit, puisque je ne travaille pas sur un ordinateur Windows-Box-je utiliser l'API OpenLDAP, qui ne semble pas prévoir que le mécanisme (au moins je ne pouvais pas trouver sur leur search page)

Ce qui m'amène à ma question: avez-vous une idée de ce que je pourrais faire pour résoudre ce problème d'une manière élégante?

Merci pour votre aide!

Répondre

1

OpenLDAP prend en charge la récupération des résultats paginés via ldap_create_page_control() et les amis. Here est une description et un exemple de code. Si cela ne m'aide pas, je pourrais être en mesure de fournir des extraits du code de production.

+0

Merci! Je vais regarder dans ce droit lundi! (Jusqu'à présent, j'ai juste abandonné sur ce sujet et nous avons augmenté la limite de la requête ...) –

+0

Je suis finalement venu pour l'implémenter. Ça marche. Merci beaucoup :) –

+0

Mon plaisir. :) – dennycrane

-3

Utilisez AD ou Novell's eDirectory? ;)

+0

Tous les types d'Active Directory (y compris celui utilisé dans les contrôleurs de domaine, et aussi ceux autonomes comme ADAM et AD LDS) normalement une limite de 1000 résultats retournés par demande, donc si vous attendez de votre requête pour revenir plus résultats que cela, vous devez utiliser une sorte de recherche paginée: soit via le contrôle Simple Paged Results, ou via le contrôle Virtual List View (VLV). – vond

1

J'ai rencontré un problème lors de l'utilisation de ldap_create_page_control avec ldap_search_ext_s, mon implémentation de la bibliothèque ldap utilisait LDAP version 2 par défaut et il semble qu'elle soit prise en charge pour la version 3+. Il revenait « Non pris en charge » de ldap_search_ext_s() avant mon LDAP à la version 3.

0

j'ai pu contourner la limitation de taille à l'aide ldap_control_paged_result

ldap_control_paged_result est utilisé pour activer la pagination LDAP en envoyant le paginateur . La fonction ci-dessous a parfaitement fonctionné dans mon cas.

function retrieves_users($conn) 
    { 
     $dn  = 'ou=,dc=,dc='; 
     $filter = "(&(objectClass=user)(objectCategory=person)(sn=*))"; 
     $justthese = array(); 

     // enable pagination with a page size of 100. 
     $pageSize = 100; 

     $cookie = ''; 

     do { 
      ldap_control_paged_result($conn, $pageSize, true, $cookie); 

      $result = ldap_search($conn, $dn, $filter, $justthese); 
      $entries = ldap_get_entries($conn, $result); 

      if(!empty($entries)){ 
       for ($i = 0; $i < $entries["count"]; $i++) { 
        $data['usersLdap'][] = array(
          'name' => $entries[$i]["cn"][0], 
          'username' => $entries[$i]["userprincipalname"][0] 
        ); 
       } 
      } 
      ldap_control_paged_result_response($conn, $result, $cookie); 

     } while($cookie !== null && $cookie != ''); 

     return $data; 
    }