2017-04-25 91 views
0

我正在使用ldap搜索来获取用户信息。总共有500条记录和一条从LDAP获取用户信息的函数被称为500次。php - ldap搜索需要将近30-35秒才能搜索

inside while loop 
$userInfo = getUserInfo($booking_info['user_id']); 

下面是getUserInfo函数。

function getUserInfo($passedUserId){ 
    global $ldapConnection; 
    global $bind; 
    global $baseDn; 
    if($bind){ 
     $ldapFilter = "(sAMAccountName=" . $passedUserId . ")"; 
     $ldapResult = ldap_search($ldapConnection, $baseDn, $ldapFilter); 
     $ldapInfo = ldap_get_entries($ldapConnection, $ldapResult); 
     if(isset($ldapInfo[0])){ 
      if($ldapInfo[0]["givenname"][0]){ 
       $firstName  = $ldapInfo[0]["givenname"][0]; 
      } 
      if($ldapInfo[0]["sn"][0]){ 
       $lastName  = $ldapInfo[0]["sn"][0]; 
      } 
      if($ldapInfo[0]["mail"][0]){ 
       $emailAddress = $ldapInfo[0]["mail"][0]; 
      } 
      if ($ldapInfo[0]["extensionattribute1"][0]) { 
       $costCentre = $ldapInfo[0]["extensionattribute1"][0]; 
      } 
      if ($ldapInfo[0]["department"][0]) { 
       $organizationalUnit = $ldapInfo[0]["department"][0]; 
      } 
      if ($ldapInfo[0]["manager"][0]) { 
       $lineManager = split("=", split(",", $ldapInfo[0]["manager"][0])[0])[1]; 
      } 
      return Array($firstName, $lastName, $emailAddress, $costCentre, $organizationalUnit, $lineManager); 
     } 
    } 
    return Array('None', 'None', 'None', 'None', 'None', 'None'); 
} 

这需要大约30-35秒来完成请求。

如何优化此功能以加快搜索速度?

+0

很难说瓶颈可能在哪里......你可以用'return true;'替换'getUserInfo'函数中的所有东西,然后再次运行它,看看是否会导致响应时间慢。 – Daniel

+0

谢谢@Daniel是的,我发现'ldap_search'正在让它变慢。那么,如何让内置函数快速工作呢? – Valay

回答

0

我已经将getUserInfo函数更改为接受user_id数组,并且ldap_search过滤器具有在单个请求中传递多个id的功能。

传递500个user_id的数组,所以只有一次调用getMultipleUserInfo。

的filterString将是 “(|(sAMAccountName赋= user_id0)(sAMAccountName赋= user_id1)(sAMAccountName赋= user_id2).....(sAMAccountName赋= user_id499))”

function getMultipleUserInfo($passedUsersArray){ 
    global $ldapConnection; 
    global $bind; 
    global $baseDn; 
    $userInfoArray = Array(); 
    $filterString = ''; 
    $count = 0; 
    if(is_array($passedUsersArray)){ 
     foreach ($passedUsersArrayas $key => $value) { 
      $count++; 
      $filterString .= "(sAMAccountName=" . $key . ")";     
     } 
    } 
    if($bind){ 
     $ldapFilter = "(|" . $filterString . ")"; 
     $justthese = array("ou", "sn", "givenname", "mail"); 
     $ldapResult = ldap_search($ldapConnection, $baseDn, $ldapFilter, Array(), 0, 0); 
     $ldapInfo = ldap_get_entries($ldapConnection, $ldapResult); 
     for($info=0; $info<count($ldapInfo); $info++){ 
      if(isset($ldapInfo[$info])){ 
       if($ldapInfo[$info]["givenname"][0]){ 
        $firstName  = $ldapInfo[$info]["givenname"][0]; 
       } 
       if($ldapInfo[$info]["sn"][0]){ 
        $lastName  = $ldapInfo[$info]["sn"][0]; 
       } 
       if($ldapInfo[$info]["mail"][0]){ 
        $emailAddress = $ldapInfo[$info]["mail"][0]; 
       } 
       if ($ldapInfo[$info]["extensionattribute1"][0]) { 
        $costCentre = $ldapInfo[$info]["extensionattribute1"][0]; 
       } 
       if ($ldapInfo[$info]["department"][0]) { 
        $organizationalUnit = $ldapInfo[$info]["department"][0]; 
       } 
       if ($ldapInfo[$info]["manager"][0]) { 
        $lineManager = split("=", split(",", $ldapInfo[$info]["manager"][0])[0])[1]; 
       } 
       if ($ldapInfo[$info]["extensionattribute7"][0]) { 
        $usr= strtolower($ldapInfo[$info]["extensionattribute7"][0]); 
       } 
       // return Array($firstName, $lastName, $emailAddress, $costCentre, $organizationalUnit, $lineManager); 
       if($usr=== ''){ 
        $usr= 'invalid'; 
       } 
       $userInfoArray [$usr] = Array($firstName, $lastName, $emailAddress, $costCentre, $organizationalUnit, $lineManager); 
      } 
     } 
     return $userInfoArray ; 
    } 
    return Array('None', 'None', 'None', 'None', 'None', 'None'); 
} 

这现在只需3- 4秒钟完成搜索。