PHP ldap_search设置返回250条条目时出现‘Partial search results returned: Sizelimit exceeded’错误的咨询
嘿,我来帮你理清楚这个问题~首先,你遇到的这个Partial search results returned: Sizelimit exceeded错误并不是程序bug,而是LDAP协议的正常行为,咱们来一步步拆解原因和解决办法:
为什么会出现这个错误?
你修改的那个参数是LDAP搜索的sizelimit(也就是ldap_search的第6个参数),它的作用是告诉LDAP服务器:“最多返回X条结果”。当你设置为250时,服务器在累计返回250条条目后,就会触发这个大小限制超出的错误,同时返回已经找到的250条数据——这就是为什么你看到结果看似正确,但错误提示依然出现的原因。
而你用的分页控件(LDAP_CONTROL_PAGEDRESULTS)的size参数,是控制每一页返回多少条,和sizelimit是完全独立的两个设置。当sizelimit小于总条目数时,服务器就会在达到限制时抛出这个错误。
实现需求的两种正确方法
方法1:自己在代码中计数控制总条数(推荐)
这种方法不需要依赖服务器的sizelimit,而是在本地代码里统计已获取的条目数,达到250条就直接停止查询,这样不会触发服务器的错误提示。修改后的代码如下:
$cookie = ''; $totalFetched = 0; $targetCount = 250; // 你想要的总条数 do { // 把sizelimit设为0(表示服务器不限制返回条数) $result = ldap_search( $link, 'cn=students, cn=campus', '(id=*)', array('dn'), 0, 0, 0, LDAP_DEREF_NEVER, [['oid' => LDAP_CONTROL_PAGEDRESULTS, 'value' => ['size' => 2, 'cookie' => $cookie]]] ); ldap_parse_result($link, $result, $errcode , $matcheddn , $errmsg , $referrals, $controls); $entries = ldap_get_entries($link, $result); foreach ($entries as $entry) { if (isset($entry['dn'])) { echo "dn: " . $entry['dn'] . "<br>"; $totalFetched++; // 达到目标条数,直接跳出所有循环 if ($totalFetched >= $targetCount) { break 2; // 跳出foreach和外层的do-while循环 } } } // 更新分页cookie $cookie = isset($controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie']) ? $controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'] : ''; } while (!empty($cookie));
方法2:处理预期的错误码
如果你依然想用sizelimit参数,可以在代码中捕获LDAP_SIZELIMIT_EXCEEDED错误码(值为4),因为这是预期的情况,不需要中断程序。修改后的代码片段如下:
// 在ldap_parse_result之后添加错误处理 ldap_parse_result($link, $result, $errcode , $matcheddn , $errmsg , $referrals, $controls); // 只处理非预期的错误 if ($errcode !== 0 && $errcode !== LDAP_SIZELIMIT_EXCEEDED) { die("LDAP查询错误: $errmsg"); } // 后续的条目处理逻辑不变...
这样即使服务器返回大小限制错误,程序也会继续处理已返回的条目,不会抛出错误提示。
总结
那个错误提示本身是正常的,是LDAP服务器严格执行你设置的sizelimit参数的结果。如果想避免这个错误,推荐用方法1自己控制条数;如果接受这个错误但不想显示,可以用方法2处理预期的错误码。
内容的提问来源于stack exchange,提问作者Tom

