Столкнулся с следующей проблемой, на сайте есть служба поддержки, где ведется переписка с пользователем и админом. Появилась проблема, что вся админка стала очень долго грузиться, была выявлена причина, долгую загрузку давал метод подсчета (количества не отвеченных сообщений), а так как он отображается на любой странице в админке, то любая страница начала грузиться более 5 секунд.
Ниже приведу кусок кода с модели и контроллера, что бы увидеть общую картину:
Контроллер:
function getCount()
{
$cnt = model_support::getUnreadAdmin();
if($cnt > 0)
{
echo '<span class="">'.$cnt.'</span>';
}
}
Модель: (есть два варианта подсчета, но один из них работает быстрее но считает не совсем верно, он будет подписан как "вариант 2")
Вариант1
public static function getUnreadAdmin()
{
$list = self::getAdminList();
$cnt = 0;
foreach($list as $k)
{
$last = $k->getLastMessage();
if($last['author_type'] == 'user' and !$last['admin_readed'])
$cnt++;
}
return $cnt;
}
Вариант 2
public static function getUnreadAdmin()
{
$stmt = database::query("SELECT COUNT(id) AS cnt FROM (SELECT * FROM (SELECT * FROM support ORDER BY created_at DESC) s GROUP BY user_id) ss WHERE admin_readed=0 AND author_type='user'");
$stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC)['cnt'];
}
В первом варианте в метод вызывается getAdminList()
Вот эта функция:
public static function getAdminList()
{
$list = database::i()->support()->order('created_at DESC')
->select('support.*, COUNT(support.id) as cnt')
->group('user_id')
// ->order('created_at DESC')->limit(10)
->order('created_at DESC')
->fetchPairs('id');
uasort($list, function($a, $b){
// return ($a->getLastMessage()['author_type'] == 'user') ? -1 : 1;
return ($a->getLastMessage()['created_at'] > $b->getLastMessage()['created_at']) ? -1 : 1;
});
// $stmt = database::query("SELECT *, COUNT(id) AS cnt FROM (SELECT * FROM support ORDER BY created_at DESC) s GROUP BY user_id order by created_at desc");
// $list = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $list;
}
Буду рад помощи в этой ситуации, а так же предложению как это еще можно делать. Спасибо!
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Возникла проблема вызова функции по хэндлеру onClick в ejs из get запросаФункция должна лежать на сервере ибо будут выполнятся операции с бд и т