Сохранять информацию о данных в СЕССИИ вместо использования запроса MySQL?

У меня есть система уведомлений, похожая на Facebook, где пользователи получают уведомления в зависимости от того, кто опубликовал / понравился / оценил на каком конкретном сайте.

На данный момент вы получите уведомление, когда вы создаете какой-либо контент или вы разместили на определенном контенте следующее заявление mysql:

SELECT
n.`id`,n.`site`,n.`site_id`,n.`creator_uid`,n.`type`,
nu.`id` AS nuid, nu.`uid` AS nu_uid, nu.`date`,
nr.`id` AS nrid, nr.`uid` AS nr_uid, nr.`is_read`,
u.`gender`

FROM `notification` AS n
LEFT JOIN `notification_user` AS nu ON nu.`nid` = n.`id`
LEFT JOIN `notification_read` AS nr ON nr.`nid` = n.`id`
LEFT JOIN `users` AS u ON u.`id` = nu.`uid`
WHERE
nu.`uid` != '".$_SESSION['uid']."' AND nr.`uid` = '".$_SESSION['uid']."'
OR
(
nu.`uid` = '".$_SESSION['uid']."' AND n.`type` = 'credits'
)
ORDER BY date DESC, nu.`id` DESC
LIMIT 7

Теперь я создал систему друзей и хочу показать действия своих друзей также в виде уведомлений. Я думал встроить это в утверждение, но это утверждение загружается на каждой странице всего сайта, и я думаю, что это уже довольно сложно для исполнения. Итак, пройдя через users_friends Я полагаю, что таблицы каждый раз, когда «собирать» идентификаторы моего друга будут еще сложнее для производительности. Поэтому я подумал о том, чтобы сохранить эти данные идентификаторов друзей в моей СЕССИИ, например, так:

// get friends user ids
$result = mysql_query("SELECT
CASE
WHEN `sent_uid`='".$_SESSION['uid']."' THEN `get_uid`
WHEN `get_uid`='".$_SESSION['uid']."' THEN `sent_uid`
END AS uid

FROM `users_friends` WHERE `status`='1' AND
(`get_uid`='".$_SESSION['uid']."' OR `sent_uid`='".$_SESSION['uid']."')
") or die(mysql_error());
$i=1;
$num_rows = mysql_num_rows($result);
if (!empty($num_rows) && empty($_SESSION['friends']))
{
while ($data = mysql_fetch_assoc($result))
{
$_SESSION['friends'][] = $data['uid'];
}
}

Теперь у меня есть массив с именем $_SESSION['friends'] со значениями, например, «39,2,49». Я не думал о реализации этого сейчас в запросе уведомлений, потому что сначала я хотел спросить, является ли эта попытка хотя бы разумной, или я должен выбрать другой способ сделать это? Я ценю любые предложения.

1

Решение

Вы можете реализовать что-то подобное, но ИМХО вам нужен подход кеша.

Это зависит от нескольких факторов, но, как правило, я не использую сессии для хранения данных, которые должны быть сохранены. В этом случае я бы сделал что-то вроде:

  1. Установите APC (или другую кеш-систему)
  2. Если вы используете Laravel или какой-то другой PHP FW, работающий с кешем, все равно будет очень легко … Сделайте функцию, чтобы получить ваш запрос, и в рамках этой функции проверьте ключ кеша на основе идентификатора пользователя. Если ключ кеша существует, верните его значение, иначе запросите вашу базу данных и сохраните результаты в кеше.
  3. Каждый раз, когда вы обновляете данные для этого списка друзей, очищайте ключ кеша, связанный с пользователем.

Таким образом, вы сохраните данные и избежите ударов БД и обходных путей к сессиям.

Просто идея, надеюсь, это поможет или вдохновит. Хорошо выглядишь!

1

Другие решения

Зачем делать больше, когда вы можете делать меньше и иметь лучшее решение? 🙂
Зачем делать строку через запятую? Просто сохраните это как массив. Таким образом, вы можете делать разные вещи, как поисковый массив и т. д. и всякий раз, когда вам нужна строка, разделенная запятыми, вы можете использовать implode() функция.

Также, если Вам не нужно запрашивать базу данных, если заполнено $ _SESSION [‘friends’], перенести запрос в условный блок.

if (empty($_SESSION['friends'])) {
$result = mysql_query(...);
while ($data = mysql_fetch_assoc($result)) {
$_SESSION['friends'][] = $data['uid'];
}
}
1

По вопросам рекламы [email protected]