За последние 24 часа нас посетили 21609 программистов и 1028 роботов. Сейчас ищут 722 программиста ...

Отправка уведомления (почтой) о новом сообщении.

Тема в разделе "Решения, алгоритмы", создана пользователем treamz, 19 окт 2015.

  1. treamz

    treamz Активный пользователь

    С нами с:
    28 янв 2012
    Сообщения:
    5
    Симпатии:
    0
    Добрый день! Подскажите алгоритм реализации отправки сообщения по cron
    1. Имеется переписка между всеми пользователями (хранится статус сообщения прочитано/нет, дата, кто, кому, id сообщения)
    2. Имеется статус пользователя онлайн/офлайн, даты хранятся в базе (когда был последний раз)

    Необходимо отправлять ОДНО сообщение пользователю, который сейчас находится в офлайне, при том, что отправка должна быть ОДНА, даже если было отправлено сообщение от того же пользователя, но через промежуток времени. То есть отправив еще 1 сообщение через час, уведомление уже не приходит. И так все в цикле для всех пользователей.
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    по умолчанию хранить 0 счетчике оповещений. отправив первое письмо - накрутить до единицы. отправив второе письмо - накрутить до двойки. более писем не отправлять. для проявившегося в онлайне счетчик сбросить. или можно по дате последнего действия: +50-70 минут с последней активности - первое письмо, +110-120 - второе, всё выше - не оповещать. второй вариант мне нравится, да.
     
  3. treamz

    treamz Активный пользователь

    С нами с:
    28 янв 2012
    Сообщения:
    5
    Симпатии:
    0
    а по дате как получается? крон запускать получается в промежуток 50-70 минут (например каждый час), чтобы повторно не отправить уведомление

    Добавлено спустя 39 минут 48 секунд:
    По итогу получилось такая выборка. И ставим крон на 1 час, тогда по идеи 1 сообщение максимум 1 раз в час. Все верно?

    Код (PHP):
    1. SELECT a.*, DATE_FORMAT(b.last_datetime, '%Y-%m-%d %H:%i') as datetime, c.email FROM `dialog_user` a
    2. LEFT JOIN contact_user b ON (b.id = a.komy)
    3. LEFT JOIN contact_emails c ON (c.contact_id = a.komy)
    4. WHERE a.status = 0 AND 
    5. b.last_datetime BETWEEN (DATE_SUB(NOW(),INTERVAL 50 MINUTE)) AND (DATE_SUB(NOW(),INTERVAL 10 MINUTE))
    6. GROUP BY a.komy
    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]