Beispiel #1
0
 /**
  * Получить список отношений разговор-юзер по списку айдишников
  *
  * @param array $aTalkId	Список ID сообщений
  * @param int $sUserId	ID пользователя
  * @return array
  */
 public function GetTalkUsersByArray($aTalkId, $sUserId)
 {
     if (!is_array($aTalkId)) {
         $aTalkId = array($aTalkId);
     }
     $aTalkId = array_unique($aTalkId);
     $aTalkUsers = array();
     $aTalkIdNotNeedQuery = array();
     /**
      * Делаем мульти-запрос к кешу
      */
     $aCacheKeys = func_build_cache_keys($aTalkId, 'talk_user_', '_' . $sUserId);
     if (false !== ($data = $this->Cache_Get($aCacheKeys))) {
         /**
          * проверяем что досталось из кеша
          */
         foreach ($aCacheKeys as $sValue => $sKey) {
             if (array_key_exists($sKey, $data)) {
                 if ($data[$sKey]) {
                     $aTalkUsers[$data[$sKey]->getTalkId()] = $data[$sKey];
                 } else {
                     $aTalkIdNotNeedQuery[] = $sValue;
                 }
             }
         }
     }
     /**
      * Смотрим чего не было в кеше и делаем запрос в БД
      */
     $aTalkIdNeedQuery = array_diff($aTalkId, array_keys($aTalkUsers));
     $aTalkIdNeedQuery = array_diff($aTalkIdNeedQuery, $aTalkIdNotNeedQuery);
     $aTalkIdNeedStore = $aTalkIdNeedQuery;
     if ($data = $this->oMapper->GetTalkUserByArray($aTalkIdNeedQuery, $sUserId)) {
         foreach ($data as $oTalkUser) {
             /**
              * Добавляем к результату и сохраняем в кеш
              */
             $aTalkUsers[$oTalkUser->getTalkId()] = $oTalkUser;
             $this->Cache_Set($oTalkUser, "talk_user_{$oTalkUser->getTalkId()}_{$oTalkUser->getUserId()}", array("update_talk_user_{$oTalkUser->getTalkId()}"), 60 * 60 * 24 * 4);
             $aTalkIdNeedStore = array_diff($aTalkIdNeedStore, array($oTalkUser->getTalkId()));
         }
     }
     /**
      * Сохраняем в кеш запросы не вернувшие результата
      */
     foreach ($aTalkIdNeedStore as $sId) {
         $this->Cache_Set(null, "talk_user_{$sId}_{$sUserId}", array("update_talk_user_{$sId}"), 60 * 60 * 24 * 4);
     }
     /**
      * Сортируем результат согласно входящему массиву
      */
     $aTalkUsers = func_array_sort_by_keys($aTalkUsers, $aTalkId);
     return $aTalkUsers;
 }
Beispiel #2
0
 /**
  * Получить список отношений разговор-юзер по списку айдишников
  *
  * @param array $aTalksId    Список ID сообщений
  * @param int   $iUserId    ID пользователя
  *
  * @return array
  */
 public function GetTalkUsersByArray($aTalksId, $iUserId)
 {
     if (!is_array($aTalksId)) {
         $aTalksId = array($aTalksId);
     }
     $aTalksId = array_unique($aTalksId);
     $aTalkUsers = array();
     $aTalkIdNotNeedQuery = array();
     // Делаем мульти-запрос к кешу
     $aCacheKeys = F::Array_ChangeValues($aTalksId, 'talk_user_', '_' . $iUserId);
     if (false !== ($data = E::ModuleCache()->Get($aCacheKeys))) {
         // проверяем что досталось из кеша
         foreach ($aCacheKeys as $iIndex => $sKey) {
             if (array_key_exists($sKey, $data)) {
                 if ($data[$sKey]) {
                     $aTalkUsers[$data[$sKey]->getTalkId()] = $data[$sKey];
                 } else {
                     $aTalkIdNotNeedQuery[] = $aTalksId[$iIndex];
                 }
             }
         }
     }
     // Смотрим чего не было в кеше и делаем запрос в БД
     $aTalkIdNeedQuery = array_diff($aTalksId, array_keys($aTalkUsers));
     $aTalkIdNeedQuery = array_diff($aTalkIdNeedQuery, $aTalkIdNotNeedQuery);
     $aTalkIdNeedStore = $aTalkIdNeedQuery;
     if ($aTalkIdNeedQuery) {
         if ($data = $this->oMapper->GetTalkUserByArray($aTalkIdNeedQuery, $iUserId)) {
             foreach ($data as $oTalkUser) {
                 // Добавляем к результату и сохраняем в кеш
                 $aTalkUsers[$oTalkUser->getTalkId()] = $oTalkUser;
                 E::ModuleCache()->Set($oTalkUser, "talk_user_{$oTalkUser->getTalkId()}_{$oTalkUser->getUserId()}", array("update_talk_user_{$oTalkUser->getTalkId()}"), 60 * 60 * 24 * 4);
                 $aTalkIdNeedStore = array_diff($aTalkIdNeedStore, array($oTalkUser->getTalkId()));
             }
         }
     }
     // Сохраняем в кеш запросы не вернувшие результата
     foreach ($aTalkIdNeedStore as $sId) {
         E::ModuleCache()->Set(null, "talk_user_{$sId}_{$iUserId}", array("update_talk_user_{$sId}"), 60 * 60 * 24 * 4);
     }
     // Сортируем результат согласно входящему массиву
     $aTalkUsers = F::Array_SortByKeysArray($aTalkUsers, $aTalksId);
     return $aTalkUsers;
 }