在OpenLDAP中分页ldap_search以达到大小限制?

时间:2009-12-03 10:01:09

标签: c ldap openldap

我们目前正在从老化的专有目录服务迁移到OpenLDAP。 今天我们遇到了ldap_search_ext_s或ldapsearch一般不会返回任何结果的问题,如果当前搜索返回的条目数量达到一定限度。

不幸的是,在LDAP服务器配置中设置更大的大小限制可能只是推迟了问题,因为我们有一个非常大的数据库,我们每天早上运行的更新机制必须执行大量查询。

在MSDN文档中,我注意到有一种执行paged search的机制,这将允许我绕过大小限制。 显然这也是在RFC draft from 1996中指定的,但尚未最终确定?

无论如何,由于我不使用Windows-Box,我必须使用OpenLDAP API,它似乎没有提供这种机制(至少我在search page找不到它)

这让我想到了一个问题:你是否知道我能做些什么,以优雅的方式解决这个问题?

感谢您的帮助!

4 个答案:

答案 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? ;)