2017-04-25 31 views
0

私はuseridでユーザー情報を取得するためにldap searchを使用しています。合計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

私は、user_idsの配列を受け入れるようにgetUserInfo関数を変更しました。ldap_searchフィルタには、1回のリクエストで複数のIDを渡す機能があります。

500 user_idsの配列を渡すので、getMultipleUserInfoを一度呼び出すだけです。

filterStringになります "(|(sAMAccountNameを= user_id1)(sAMAccountNameを= user_id0)(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秒で検索を終了します。

関連する問題