PHP / MySQL: лучший способ получить новые записи? - PullRequest
0 голосов
/ 30 июля 2009

У нас есть какие-то группы на нашем сайте, где члены группы могут размещать сообщения. Я хочу замечать членов каждой группы, когда появляются новые записи.

Какой лучший способ сделать это?

Ответы [ 3 ]

0 голосов
/ 30 июля 2009

Если возможно, будет много сообщений на группу, чем стоит иметь поле на уровне группы, например LastNotificationTime, а затем запланировать задачу на поиск сообщений с созданным временем позже текущего значения LastNotificationTime (затем отправить отчет о их пользователям) и обновите LastNotificationTime до текущего времени.

Еще лучше иметь поле LastActivityTimeInGroup на уровне пользователя и сравнивать с ним дату создания сообщения (возможно, добавив к нему несколько минут для более удобного использования), поэтому только неактивные в то время пользователи будут получать любые сообщения, а если нет, то больше чем 1 за интервал времени задачи.

0 голосов
/ 30 июля 2009

В настоящее время я использую хранилище ключей для этой цели (memcachedb). что вы можете сделать, это добавить ключ, такой как 'messageread_ {message.id} _ {user.id}', установленный на любое выбранное вами значение (я просто использую int 1), а затем использовать клиент memcached, чтобы сделать getmulti для всех сообщения, которые есть у пользователя (в виде массива ключей, опубликованного выше). любой возвращаемый ключ читается:)

Я использую этот метод с 60-секундным кешем самого запроса, чтобы дать пользователям непрочитанное количество сообщений с отличными результатами.

http://memcachedb.org/

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

чтобы сделать что-то подобное, вам нужно установить клиент memcache или memcached из pecl здесь http://pecl.php.net/package/memcache и здесь http://pecl.php.net/package/memcached соответственно. выполните установку memcachedb (потребуется окно с доступом к оболочке) и запустите службу.

клиентский псевдокод будет работать примерно так:

// получать сообщения, частью которых является пользователь

код ...

// построить массив ключей memcachedb из этого списка, установить ключ в message_id для ссылки позже

$keys = array();
foreach($mresult as $current){
    $keys[$current['message_id']] = 'messageread_'.$current['message_id'].'_'.$myid;
}

// используя php-клиент memcached

$result = $memcacheobj->getMulti($keys);

getmulti возвращает ассоциативный массив в структуре 'memcachekey' => 'memcachevalue'

// зациклить результат, удалив найденные результаты из ключей

foreach($keys as $key => $val){
    if(isset($result[$val])) unset($keys[$key]);
}

// очистка для получения массива непрочитанных сообщений, переворачивание массива для установки значений в message_id, сброс ключей массива с помощью array_values ​​(необязательно)

$unread = array_values(array_flip($keys));

теперь у вас есть массив непрочитанных сообщений в структуре:

массив ( 0 => 12, 1 => 23, так далее... )

это всего лишь грубый макет процесса, я уверен, что некоторая очистка может быть сделана, чтобы оптимизировать это:)

0 голосов
/ 30 июля 2009

Если вы хотите немедленно уведомить их, вы можете просто отправить им электронное письмо / что угодно сразу же, как только вы сохраните сообщение.

В противном случае вы можете хранить наибольшее значение «read» для каждого пользователя, тогда вы можете довольно легко получить любые последующие сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...