Necesito obtener más de las 1000 entradas devueltas por mi búsqueda LDAP actual. Actualmente estoy ejecutando en un servidor de Windows con IIS y PHP 7.4, pero pronto actualizaré a 8.0.
Lo que he probado hasta ahora es esto:
# Connect to the LDAP server $ldap = ldap_connect("ldaps://my.ldap.server:636"); ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0); $ldapBind = ldap_bind($ldap, "UserName", "Password"); # Do a search $searchResult = ldap_search($ldap, "DC=something1,DC=something2", "LDAP query); $countEntries += ldap_count_entries($ldap, $searchResult); $info = ldap_get_entries($ldap, $searchResult); # Process each found LDAP data row - this will be a maximum of 1000 rows for($i=0; $i < $info["count"]; $i++) { # do something ... } Esto solo me dará las primeras 1000 filas, pero necesito leer al menos 30000 filas. El uso de "consultas con nombre" como mail=a* y mail=b* no es una solución viable, ya que podría haber más de 1000 entradas allí, por lo que necesito algún tipo de enfoque paginado confiable: una página por otra.
Puedo ver que lo más probable es que deba usar controles LDAP ya que ldap_control_paged_result ya no es una opción después de PHP 7.4, pero realmente no entiendo eso, ¿cómo usar esto?
¿Alguien tiene algunos consejos sobre qué hacer aquí? :-)
Hay un ejemplo en la documentación de PHP (ver ejemplo #5) sobre cómo obtener y paginar datos de LDAP en PHP 7.4+.
El siguiente fragmento de código de la documentación oficial se ha ajustado a un tamaño de página de 750 elementos por página.
// $link is an LDAP connection $cookie = ''; do { $result = ldap_search( $link, 'dc=example,dc=base', '(cn=*)', ['cn'], 0, 0, 0, LDAP_DEREF_NEVER, [['oid' => LDAP_CONTROL_PAGEDRESULTS, 'value' => ['size' => 750, 'cookie' => $cookie]]] ); ldap_parse_result($link, $result, $errcode , $matcheddn , $errmsg , $referrals, $controls); // To keep the example short errors are not tested $entries = ldap_get_entries($link, $result); foreach ($entries as $entry) { echo "cn: ".$entry['cn'][0]."\n"; } if (isset($controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'])) { // You need to pass the cookie from the last call to the next one $cookie = $controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie']; } else { $cookie = ''; } // Empty cookie means last page } while (!empty($cookie));