我为社交媒体制作了一个人的目录,其中包括社交媒体等图片。 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个用户是不可能的..
这不是服务器方面的问题,因为当我使用完全相同的过滤器执行此研究时,使用Apache Directory Studio的时间不到1秒......
答案 0 :(得分:0)
正如@LudovicPoitou在评论中所说,你遍历目录中的所有用户。
对于您在Web应用程序中显示的一个页面中的每个24位用户,您的请求都是整个目录。
我想你的问题是$pageSize
等于24,所以你所做的就是检索目录的每个用户,每个请求有24个用户的页面。
然后,对于1000个条目,您会发出42个以上的请求来检索1000多个用户,以便在您的应用的每个页面上仅显示其中的24个。
您应该只通过所述1000个用户的页面请求所有这些用户一次,并使用完整的用户组成为分页客户端。
这是对页面结果使用的误解,它不是你想要结果0到24而下一个请求是结果25到49等的分页结果。 (至少在您使用php的Web应用程序配置中,因为您没有与您使用用户输入的cookie进行下一次搜索的目录的有状态连接)
编辑:
用not stateful
来说明我的意思。当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 | +---------------> |
| <---------------+ | |
+ + +