【问题标题】:Using PHP to search a LDAP base with pagination使用 PHP 通过分页搜索 LDAP 库
【发布时间】:2016-04-13 20:44:14
【问题描述】:

我需要遍历 LDAP 基础上的所有条目。实际上,LDAP 服务器每次搜索限制为 500 个条目。我正在使用 PHP 5.6。

我使用ldap_control_paged_resultldap_control_paged_result_response 找到了可能的解决方案,并且只实现了一个简单的测试脚本:

 (...)
 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 != '');

但我仍然无法检索超过 500 个条目,这是输出:

(...)
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); 电话真的发生在搜索之前吗?如果是这样,则需要在ldap_connect() 之后、ldap_bind() 之前调用。这可以解释它,因为分页是 LDAP v3 功能,如果它没有在正确的位置设置协议版本,它可能不会生效。
  • @rkosegi 对于 IMO 可能更简单的问题,这是一个非常完整且复杂的解决方案。最后,问题得到解决,扩大了服务器限制。不是最好的解决方案,但它正在工作(目前)。

标签: php pagination ldap


【解决方案1】:

您应该在此处找到有关如何检索 500 多个条目的答案: How can I send whole array from php cycle?。对于分页,您可以使用例如DataTables

【讨论】:

  • 这不适用于 OPs 问题。问题是 LDAP 服务器大小结果限制。
  • 我也有同样的问题,这个答案对我有帮助。当然对您来说是最好的答案:将您的 LDAP 服务器的限制设置为高于 500。这就是为什么您只是在没有任何相关反馈的情况下投反对票。 顺便说一句。这不是正确的方法,因为你会在一段时间后再次遇到同样的问题。
  • 如果可以的话,我会再次投反对票。设置服务器大小限制不是解决方案(也不是您的答案)。您需要使用正确的 API 来检索分页结果。我这样做了几次。只需使用符合 RFC 2696 的 API。您指的是关于将结果合并到一个数组中的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多