2016-03-29 2 views
0

durchsuchen Ich muss alle Einträge auf einer LDAP-Basis durchlaufen. Tatsächlich ist der LDAP-Server für jede Suche auf 500 Einträge beschränkt. Ich arbeite mit PHP 5.6.Mit PHP eine LDAP-Basis mit Seitenumbruch

fand ich die mögliche Lösung ldap_control_paged_result und ldap_control_paged_result_response und einfach implementiert ein einfaches Testskript:

(...) 
498 - NAME SUPRESSED 
499 - NAME SUPRESSED 
500 - NAME SUPRESSED 
WARNING: ldap_control_paged_result_response(): Result is: Size limit exceeded (4) 
WARNING: ldap_control_paged_result_response(): Result is: Size limit exceeded (4) 
WARNING: ldap_control_paged_result_response(): Result is: Size limit exceeded (4) 
(...) 
:

(...) 
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3); 

$pageSize = 100; 
$cookie = ''; 
$count = 0; 
do { 
    ldap_control_paged_result($conn, $pageSize, true, $cookie); 

    $result = ldap_search($conn, 'ou=people,dc=ufsf,dc=br', 'uid=*', ['uid', 'name']); 
    $entries = ldap_get_entries($conn, $result); 

    foreach ($entries as $entry) { 
     $count++; 
     echo $count . ' - ' . $entry['name'][0] . PHP_EOL; 
    } 

    ldap_control_paged_result_response($conn, $result, $cookie); 

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

Aber ich kann immer noch nicht abgerufen werden mehr als 500 Einträge, Dies wird der Ausgang

Fehle ich etwas?

+0

Mögliches Duplikat von [Alle Benutzer in LDAP mit PHP auflisten] (http://stackoverflow.com/questions/1473075/enumerate-all-users-in-ldap-with-php) – rkosegi

+1

Ist das 'ldap_set_option ($ conn , LDAP_OPT_PROTOCOL_VERSION, 3); 'Aufruf wirklich direkt vor der Suche? Wenn ja, muss das nach 'ldap_connect()', aber vor 'ldap_bind()' aufgerufen werden. Das könnte dies erklären, da das Paging eine LDAP v3-Funktion ist. Wenn die Protokollversion nicht an der richtigen Stelle eingestellt wird, wird sie möglicherweise nicht wirksam. – ChadSikorra

+0

@rkosegi Das war eine ziemlich vollständige und irgendwie komplexe Lösung für etwas, das IMO viel einfacher sein könnte. Am Ende wurde das Problem gelöst, indem das Serverlimit erweitert wurde. Nicht die beste Lösung, aber es funktioniert (vorerst). – marcellorvalle

Antwort

-2

Dort sollten Sie die Antwort finden, wie Sie mehr als 500 Einträge abrufen können: How can I send whole array from php cycle?. Für die Paginierung können Sie beispielsweise DataTables verwenden.

+0

Dies gilt nicht für OP-Probleme. Problem ist das Ergebnislimit der LDAP-Servergröße. – rkosegi

+0

Ich habe auch dasselbe Problem und diese Antwort hilft mir. Für Sie ist natürlich die beste Antwort: ** Setzen Sie das Limit für Ihren LDAP-Server höher als 500 **. Deshalb werden Sie nur ohne relevantes Feedback abgelehnt. _Btw. es ist nicht der richtige Weg, weil du nach einiger Zeit wieder das gleiche Problem haben wirst. – Mardzis

+0

Ich würde es wieder runterschrauben, wenn ich könnte. Das Festlegen der Servergrößenbeschränkung ist keine Lösung (noch Ihre Antwort). Sie müssen die korrekte API verwenden, um seitenweise Ergebnisse abzurufen. Das habe ich einige Male gemacht. Verwenden Sie einfach die RFC 2696-konforme API. Sie verweisen auf die Antwort zum Zusammenführen von Ergebnissen in ein Array. – rkosegi