За последние 24 часа нас посетили 72169 программистов и 1653 робота. Сейчас ищут 892 программиста ...

Ищу алгоритм Личной Переписки Пользователей

Тема в разделе "PHP для новичков", создана пользователем bkm, 30 май 2011.

  1. bkm

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

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    В переписке не должно быть входящих/исходящих, вся переписка ведётся в одном месте.
    Слева должен находиться список с кем велась, ведётся переписка.
    Новые сообщения должны выделяться.
    Важно: если сообщение не было прочитано получателем, отправивший должен видеть прочитано/непрочитано.
    Самое важное: это всё должно ооочень быстро работать.
    ---
    Я понимаю, что это уже работа, потому готов заплатить, разумеется в разумных пределах.
    ---
    У меня есть модуль написанный для kasseler cms, но переписка ужасно тормозит.
    Список с кем ведётся переписка лежит в виде ;2;234;57;
    функцией explode я беру id и делаю запрос в базу, проверяю есть ли в переписке с этим юзером новые сообщения или нет.
    Список может состоять из десятков людей, соответственно пока функция не проверить весь список страница не загрузится, в связи с этим очень большая нагрузка на базу
     
  2. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    на форуме уже раз 5 поднималась тема

    2 таблицы

    1) Messages - id, sender_id, recipient_id, title, text
    2) Messages_actions - message_id, created_at, readed_at, delete_by_sender, delete_by_recipient

    Этого достаточно для всех описанных задач.
     
  3. bkm

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

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    ну так и у меня так же, но тормозит-то невыносимо!
    Как узнать, что есть новые сообщения от конкретного пользователя? Делаю условие, где выполняется поиск новых сообщений от конкретного пользователя из списка в конкретной переписке.

    Короче это очень долго и нагружает сайт.

    [​IMG]
    [​IMG]
    [​IMG]
     
  4. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    хз, это быстрые запросы с 1 join'ом
     
  5. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    bkm
    не вижу в чём трудность задачи. можно реализовать даже одной таблицей

    смысл данного списка?
     
  6. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Gromo

    Я несколько привел потому, что реализовывал возможность отправки 1 сообщения многим пользователям.
    У каждого была строка в actions
     
  7. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    tommyangelo
    тогда recipient_id нужно перенести в таблицу Messages_actions :)
     
  8. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Gromo

    )))))

    А там было 3 варианта - конкретному чуваку, всем, или конкретной структуре.

    Все и структура были константами.

    В общем случае - ты конечно прав))))
     
  9. bkm

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

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    так и сделано, в итоге запрос выглядит так

    $userinfo['uid'] = это, допустим мой id
    $user_id = это id юзера из списка

    Смотрим, если я получатель
    PHP:
    1. <?php
    2. SELECT m.id, c.author_id, c.onoff, c.incom FROM user_mess AS m LEFT JOIN user_mess_post AS c ON (m.id=c.cid) WHERE m.author_id='".$user_id."' && m.user_recipient='".$userinfo['uid']."'
    если я отправитель
    PHP:
    1. <?php
    2. SELECT m.id, c.author_id, c.onoff, c.incom FROM user_mess AS m LEFT JOIN user_mess_post AS c ON (m.id=c.cid) WHERE m.author_id='".$userinfo['uid']."' && m.user_recipient='".$user_id."'
    хотя incom здесь не нужен, исправлю
     
  10. bkm

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

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    Урааа, вчера целый вечер писал новый алгоритм с нуля. Производительность увеличилась в десятки раз.
    Осталось прикрутить пару фишек.
    [​IMG]
     
  11. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    bkm
    так держать! и полезно, и экономия, и сам знаешь что сделал :))