Santehnick
16.03.2013 - 17:06
Планирую написать чат на php + ajax, под хранилище наверное буду использовать redis. Возник вопрос по поводу того, как извлекать новые сообщения для пользователя. Изначально сразу пришла идея, что клиенту передавать id последнего сообщения, который он потом обратно передает серверу при запросе и сервер соответственно возвращает все сообщения начиная с этого id, но тогда пользователь может подменить id и получить не то, что предполагалось, а те сообщения, которые уже выводились вместе с новыми, а это мне не нужно. Потом думал, что проверять по времени, допустим чат обновляется раз в 15 секунд, тогда показываем только те сообщения, где время сообщения больше чем текущее время - 15 секунд, но тут опять может возникнуть проблема, что у пользователя повис браузер на несколько секунд и соответственно есть риск, что он не получит те сообщения, которые должен был получить. Потом думал, есть вариант чтобы хранить время последнего обращения / id последнего сообщения или что-нибудь другое на стороне сервера в базе или сессии например, но не нравится то, что придется постоянно перезаписывать это значение.
Пока лучший для меня из всех вариантов это передача id последнего сообщения клиенту, который будет послан вместе со следующим запросом к серверу. Но нужно как-то сделать, чтобы клиент не смог бы получить те сообщения, которые уже ему выводились ранее. Может как-то шифровать этот id или что-то еще. Может есть у кого какие идеи или опыт написания такого чата?
Valick
16.03.2013 - 17:27
Цитата |
под хранилище наверное буду использовать redis |
что значит наверное? выбор должен быть обоснован, тем более что это фундамент вашего проекта.
Цитата |
но тогда пользователь может подменить id и получить не то, что предполагалось |
интересно кому он этим навредит кроме себя?
Цитата |
допустим чат обновляется раз в 15 секунд |
Valick
16.03.2013 - 17:39
Вы исходники какого-либо чата смотрели?
вот прикрепил может пригодится
_____________
Стимулятор ~yoomoney - 41001303250491
Lenarfate
16.03.2013 - 17:46
Santehnick
советую почитать про node.js или phpdaemon
Santehnick
16.03.2013 - 18:06
Цитата (Valick @ 16.03.2013 - 13:39) |
Вы исходники какого-либо чата смотрели? вот прикрепил может пригодится |
Посмотрел, ну тоже самое о чем я и писал. передается id последнего сообщения от клиента, и выбираются все сообщения старше этого id. Вот здесь например
public function retrieveNewMessages($id=0)
{
$id = $this->mMysqli->real_escape_string($id);
if($id>0)
{
$query =
'SELECT chat_id, user_name, message, color, ' .
' DATE_FORMAT(posted_on, "%Y-%m-%d %H:%i:%s") ' .
' AS posted_on ' .
' FROM chat WHERE chat_id > ' . $id .
' ORDER BY chat_id ASC';
}
...
}
Например последнее сообщение считается с id равным 512, при следующем обращении к серверу, мы должны получить все сообщения у которых id больше 512, но я могу подменить и отправить серверу id равный 1 например и получу все сообщения id которых больше 1, то есть и все старые вместе с новыми, о чем я и написал в первом сообщении.
Zzepish
16.03.2013 - 18:33
Учишь php, ajax, html,css и будет тебе чат!)
Santehnick
16.03.2013 - 18:38
Цитата (Lenarfate @ 16.03.2013 - 13:46) |
Santehnick советую почитать про node.js или phpdaemon |
Я в курсе, что можно сделать real-time чат. Но я же не про это спрашивал, меня изначально интересует, как мне правильно выбрать сообщения из хранилища, чтобы избежать тех самых "но" о которых сказано в первом сообщении.
Цитата |
Учишь php, ajax, html,css и будет тебе чат!)
|
Ох, причем тут это? Вопрос, совершенно в другом. Стоило ли вам вообще напрягаться и писать это бесполезное сообщение.
IT_developer
16.03.2013 - 18:52
Я вот тоже знаю что нужно хранить id последнего сообщения и далее выбирать сообщение где id старше сохраненного id. Только вопрос: а где хранить этот id, что бы в прибавок было еще и безопасно?
Santehnick
16.03.2013 - 18:59
Цитата (IT_developer @ 16.03.2013 - 14:52) |
Я вот тоже знаю что нужно хранить id последнего сообщения и далее выбирать сообщение где id старше сохраненного id. Только вопрос: а где хранить этот id, что бы в прибавок было еще и безопасно? |
В том и смысл, чтобы нигде не хранить этот последний id, при получении страницы мы просто должны последний id на текущий момент отдавать клиенту, а клиент потом потом вместе с запросом к серверу посылает этот id. А хранить где бы то ни было последний id сообщения или время последнего обращения или что-то другое, считаю излишним и делать так бы не стал никогда.
Valick
16.03.2013 - 19:18
Цитата |
но я могу подменить и отправить серверу id равный 1 например и получу все сообщения id которых больше 1 |
и что? сервер упадет, или солнце погаснет?
во первых старые сообщения можно удалять, во вторых валидацию id никто не отменял и если вам жалко старые сообщения, то установите лимит выборки
_____________
Стимулятор ~yoomoney - 41001303250491
Santehnick
16.03.2013 - 19:34
Это все понятно, в redis итак ключи будут писаться с ограниченным сроком жизни, кроме того и храниться в оперативной памяти, просто не хотелось бы чтобы пользователь мог выводить сообщения, которые уже получал. Подумаю еще, может сделаю хранение last id на стороне сервера, что исключит возможность получения уже полученных сообщений и если особо сервер грузить не будет, то пусть так оно и остается, если будет, тогда передавать на сторону клиента last id. В любом случае, как я понял, нет вариантов запретить пользователю получать уже полученные сообщения, если id отдавать клиенту.
m4a1fox
16.03.2013 - 19:48
Santehnick
Интереса ради. Коли уж вы опереруете таким понятием как redis, то почему при написании чата, выбор пал на такую банальную (уж простите) связку как php+ajax? Спрашиваю, дествительно ради интереса....
Santehnick
16.03.2013 - 20:33
Цитата (m4a1fox @ 16.03.2013 - 15:48) |
Santehnick Интереса ради. Коли уж вы опереруете таким понятием как redis, то почему при написании чата, выбор пал на такую банальную (уж простите) связку как php+ajax? Спрашиваю, дествительно ради интереса.... |
Comet и подобное противоречит самому определению HTTP, технологии клиент-сервер

Так что будем придерживаться традиционной ориентации

Ну а вообще, я не единственный разработчик в команде и уровень знаний/умений у всех разный, но есть необходимый минимум, которым должен обладать каждый.
m4a1fox
16.03.2013 - 20:35
Цитата (Santehnick @ 16.03.2013 - 16:33) |
Цитата (m4a1fox @ 16.03.2013 - 15:48) | Santehnick Интереса ради. Коли уж вы опереруете таким понятием как redis, то почему при написании чата, выбор пал на такую банальную (уж простите) связку как php+ajax? Спрашиваю, дествительно ради интереса.... |
Comet и подобное противоречит самому определению HTTP, технологии клиент-сервер  Так что будем придерживаться традиционной ориентации  Ну а вообще, я не единственный разработчик в команде и уровень знаний/умений у всех разный, но есть необходимый минимум, которым должен обладать каждый. |
А причет тут Commet?
В частности я говорб про связку с nodeJS.....
В сессии сохранять состояние (id, ...) и ниуто не подменит )
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.