我们目前正在从老化的专有目录服务迁移到OpenLDAP。 今天我们遇到了ldap_search_ext_s或ldapsearch一般不会返回任何结果的问题,如果当前搜索返回的条目数量达到一定限度。
不幸的是,在LDAP服务器配置中设置更大的大小限制可能只是推迟了问题,因为我们有一个非常大的数据库,我们每天早上运行的更新机制必须执行大量查询。
在MSDN文档中,我注意到有一种执行paged search的机制,这将允许我绕过大小限制。 显然这也是在RFC draft from 1996中指定的,但尚未最终确定?
无论如何,由于我不使用Windows-Box,我必须使用OpenLDAP API,它似乎没有提供这种机制(至少我在search page找不到它)
这让我想到了一个问题:你是否知道我能做些什么,以优雅的方式解决这个问题?
感谢您的帮助!
答案 0 :(得分:1)
OpenLDAP支持通过ldap_create_page_control ()
和朋友进行分页结果检索。 Here是一个描述和示例代码。如果这没有帮助,我可以提供生产代码的摘录。
答案 1 :(得分:1)
我在使用ldap_create_page_control和ldap_search_ext_s时遇到了问题,我的ldap库实现默认使用LDAP版本2,它看起来支持版本3+。在我将LDAP设置为版本3之前,它从ldap_search_ext_s()返回“不支持”。
答案 2 :(得分:0)
我能够使用ldap_control_paged_result
来克服大小限制ldap_control_paged_result用于通过发送分页控件来启用LDAP分页。以下功能在我的案例中完美运作。
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;
}
答案 3 :(得分:-3)
使用AD或Novell的eDirectory? ;)