2017-04-25 89 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秒鐘完成搜索。