Php 优化ldap研究的执行时间

Php 优化ldap研究的执行时间,php,ldap,Php,Ldap,我为我的societe生成了一个带有图片等的人员目录,就像社交媒体一样。LDAP中大约有1000多个用户,他花了很长时间来进行研究,以获得屏幕上的所有用户 正是这一部分需要4到7秒来进行研究: do { ldap_control_paged_result($ldap, $pageSize, true, $cookie); $sr=ldap_search($ldap, $dn, $filter, $justthese); $i

我为我的societe生成了一个带有图片等的人员目录,就像社交媒体一样。LDAP中大约有1000多个用户,他花了很长时间来进行研究,以获得屏幕上的所有用户

正是这一部分需要4到7秒来进行研究:

do {
            ldap_control_paged_result($ldap, $pageSize, true, $cookie);
            $sr=ldap_search($ldap, $dn, $filter, $justthese);
            $info = ldap_get_entries($ldap, $sr);
            foreach ($info as $in) {
                if(isset($in[$GLOBALS['nom']][0])){
                $array[0][$inc]=$in[$GLOBALS['nom']][0];
                $array[1][$inc]=$in[$GLOBALS['prenom']][0];
                $inc++;
            }
            }
            $test++;

            ldap_control_paged_result_response($ldap, $sr, $cookie);
    } while($cookie !== null && $cookie != '');
我不知道如何优化它,5秒钟生成一个每页限制24个用户的页面是不可能的


这不是服务器端的问题,因为当我使用完全相同的过滤器、相同的dn使用Apache Directory Studio执行这项研究时,只需不到1秒的时间…

正如@LudovicPoitou在他的评论中所说的,您在目录中循环所有用户

对于web应用程序中显示的一个页面中的每24个用户,您的请求将覆盖整个目录

我猜从你的问题来看,
$pageSize
等于24,所以你要做的是检索目录中的每个用户,每个请求有24个用户

然后,对于1000个条目,您会发出42个以上的请求来检索1000多个用户,以便在应用程序的每个页面上仅显示其中的24个用户

您应该一次按1000个用户的页面请求所有这些用户,并使分页客户端具有完整的用户集

这是对页面结果用法的误解,它不是分页结果,您希望结果0到24,下一个请求是结果25到49,以此类推。 (至少不在使用php的web应用程序配置中,因为您未处于与目录的有状态连接中,您在用户输入时使用cookie执行下一次搜索)

编辑:

为了说明我所说的
无状态的意思
。当PHP脚本结束执行时,每个变量都会被销毁,因此与LDAP服务器的连接也会被破坏。然后,附加到分页控件的cookie将不再可用,因为它链接到所做的搜索请求。图中所示为:

STATEFUL


    CLIENT             BACKEND               LDAP
      +                   +                   +
      |    REQUEST page1  |                   |
      | +---------------> |  CONNECT + BIND   |
      |                   | +--------+------> |
      |                   |  SEARCH PAGE 1    |
      |                   | +---------------> |
      |                   |      RESPONSE     |
      |      RESPONSE     | <---------------+ |
      | <---------------+ |                   |
      |                   |                   |
      |   REQUEST page 2  |                   |
      | +---------------> |    SEARCH PAGE 2  |
      |                   | +---------------> |
      |                   |     RESPONSE      |
      |     RESPONSE      | <---------------+ |
      | <---------------+ |                   |
      |                   |  DISCONNECT       |
      |                   | +---------------> |
      |                   |                   |
      |                   |                   |
      +                   +                   +


STATELESS


    CLIENT               PHP                 LDAP
      +                   +                   +
      |    REQUEST page1  |                   |
      | +---------------> |  CONNECT + BIND   |
      |                   | +--------+------> |
      |                   |  SEARCH ALL PAGES |
      |                   | +---------------> |
      |                   |      RESPONSE     |
      |                   | <---------------+ |
      |                   |  DISCONNECT       |
      |      RESPONSE     | +---------------> |
      | <---------------+ |                   |
      +                   +                   +
有状态
客户端后端LDAP
+                   +                   +
|请求第1页||
|+------------->|连接+绑定|
|                   | +--------+------> |
||搜索第1页|
|                   | +---------------> |
||回应|
|答复||
||回应|
|响应| |连接+绑定|
|                   | +--------+------> |
||搜索所有页面|
|                   | +---------------> |
||回应|
|                   |  |

|在您的代码中,您循环页面以获取所有用户。如果需要更改页面,为什么不直接获取一个页面并显示它,然后加载下一个用户。是的,但要这样做,我需要一个偏移量。。。我不知道如何使用这个偏移量。。。我理解这个问题,但如何避免每次我需要创建页面时搜索全部而不是仅搜索24个用户。。。你想用我的分页系统完成整个功能吗?@Srithovic这不是偏移量的问题。您不能使用无状态连接(如php和webapp)进行分页搜索。只有当
do{}while
的每个循环都由用户输入控制,而不是由仍有条目要获取的事实控制时,这才可能起作用。您应该做的是将每个用户条目作为数据集返回给客户机,如果需要,让客户机使用分页来呈现此数据集,但不要在服务器上的每个页面更改上重复此请求client@Srithovic因为一张图片胜过千言万语,所以我制作了一个模式来解释在PHP代码中发出请求时发生了什么。希望现在更清楚,这样我的函数返回排序后的数组,我在客户端调用函数时添加页码作为参数,在my for()中(允许显示用户),我为($I=$pageSize*($currentPageNumber-1);$I<$pageSize*$currentPageNumber;I++)编写可以工作的代码?我现在无法访问我们的LDAP,我在一个客户社会中。@Srithovic没有。PHP不是那样工作的。分页控制结果是LDAP协议上的一个扩展操作,cookie链接到请求,请求在多个响应上拆分响应,而不是进行分页搜索。当PHP脚本结束时,cookie以及PHP脚本中的所有其他变量都将被销毁,LDAP连接将关闭,请求将消失,等等。