You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP ldap_search设置返回250条条目时出现‘Partial search results returned: Sizelimit exceeded’错误的咨询

解决OpenLDAP分页查询时的大小限制错误问题

嘿,我来帮你理清楚这个问题~首先,你遇到的这个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 00:57:43