2017-04-25 1 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

병목이 어디에 있는지 ... 'getUserInfo' 함수의 모든 것을'return true; '와 같이 간단하게 대체하고 다시 실행하여 느린 응답 시간을 유발하는지 확인할 수 있습니까? – Daniel

+0

고마워요 @ 대니얼 예. 나는'ldap_search'가 느리게 만드는 것을 알아 냈습니다. 그렇다면 어떻게 내장 함수를 빠르게 작동시킬 수 있습니까? – Valay

답변

0

필자는 getUserInfo 함수가 user_ids의 배열을 허용하도록 변경했으며 ldap_search 필터에는 단일 요청으로 여러 ID를 전달하는 기능이 있습니다.

500 user_ids의 배열을 전달하므로 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 초 동안 검색을 마칩니다.