[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: чат php + ajax
Santehnick
Планирую написать чат на php + ajax, под хранилище наверное буду использовать redis. Возник вопрос по поводу того, как извлекать новые сообщения для пользователя. Изначально сразу пришла идея, что клиенту передавать id последнего сообщения, который он потом обратно передает серверу при запросе и сервер соответственно возвращает все сообщения начиная с этого id, но тогда пользователь может подменить id и получить не то, что предполагалось, а те сообщения, которые уже выводились вместе с новыми, а это мне не нужно. Потом думал, что проверять по времени, допустим чат обновляется раз в 15 секунд, тогда показываем только те сообщения, где время сообщения больше чем текущее время - 15 секунд, но тут опять может возникнуть проблема, что у пользователя повис браузер на несколько секунд и соответственно есть риск, что он не получит те сообщения, которые должен был получить. Потом думал, есть вариант чтобы хранить время последнего обращения / id последнего сообщения или что-нибудь другое на стороне сервера в базе или сессии например, но не нравится то, что придется постоянно перезаписывать это значение.

Пока лучший для меня из всех вариантов это передача id последнего сообщения клиенту, который будет послан вместе со следующим запросом к серверу. Но нужно как-то сделать, чтобы клиент не смог бы получить те сообщения, которые уже ему выводились ранее. Может как-то шифровать этот id или что-то еще. Может есть у кого какие идеи или опыт написания такого чата?
Valick
Цитата
под хранилище наверное буду использовать redis

что значит наверное? выбор должен быть обоснован, тем более что это фундамент вашего проекта.
Цитата
но тогда пользователь может подменить id и получить не то, что предполагалось

интересно кому он этим навредит кроме себя?
Цитата
допустим чат обновляется раз в 15 секунд

это чат для двоих?


_____________
Стимулятор ~yoomoney - 41001303250491
Valick
Вы исходники какого-либо чата смотрели?
вот прикрепил может пригодится

_____________
Стимулятор ~yoomoney - 41001303250491
Lenarfate
Santehnick
советую почитать про node.js или phpdaemon
Santehnick
Цитата (Valick @ 16.03.2013 - 13:39)
Вы исходники какого-либо чата смотрели?
вот прикрепил может пригодится

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


public function retrieveNewMessages($id=0)
{
// escape the variable data
$id = $this->mMysqli->real_escape_string($id);
// compose the SQL query that retrieves new messages
if($id>0)
{
// retrieve messages newer than $id
$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
Учишь php, ajax, html,css и будет тебе чат!)
Santehnick
Цитата (Lenarfate @ 16.03.2013 - 13:46)
Santehnick
советую почитать про node.js или phpdaemon

Я в курсе, что можно сделать real-time чат. Но я же не про это спрашивал, меня изначально интересует, как мне правильно выбрать сообщения из хранилища, чтобы избежать тех самых "но" о которых сказано в первом сообщении.

Цитата

Учишь php, ajax, html,css и будет тебе чат!)


Ох, причем тут это? Вопрос, совершенно в другом. Стоило ли вам вообще напрягаться и писать это бесполезное сообщение.
IT_developer
Я вот тоже знаю что нужно хранить id последнего сообщения и далее выбирать сообщение где id старше сохраненного id. Только вопрос: а где хранить этот id, что бы в прибавок было еще и безопасно?
Santehnick
Цитата (IT_developer @ 16.03.2013 - 14:52)
Я вот тоже знаю что нужно хранить id последнего сообщения и далее выбирать сообщение где id старше сохраненного id. Только вопрос: а где хранить этот id, что бы в прибавок было еще и безопасно?

В том и смысл, чтобы нигде не хранить этот последний id, при получении страницы мы просто должны последний id на текущий момент отдавать клиенту, а клиент потом потом вместе с запросом к серверу посылает этот id. А хранить где бы то ни было последний id сообщения или время последнего обращения или что-то другое, считаю излишним и делать так бы не стал никогда.
Valick
Цитата
но я могу подменить и отправить серверу id равный 1 например и получу все сообщения id которых больше 1

и что? сервер упадет, или солнце погаснет?
во первых старые сообщения можно удалять, во вторых валидацию id никто не отменял и если вам жалко старые сообщения, то установите лимит выборки

_____________
Стимулятор ~yoomoney - 41001303250491
Santehnick
Это все понятно, в redis итак ключи будут писаться с ограниченным сроком жизни, кроме того и храниться в оперативной памяти, просто не хотелось бы чтобы пользователь мог выводить сообщения, которые уже получал. Подумаю еще, может сделаю хранение last id на стороне сервера, что исключит возможность получения уже полученных сообщений и если особо сервер грузить не будет, то пусть так оно и остается, если будет, тогда передавать на сторону клиента last id. В любом случае, как я понял, нет вариантов запретить пользователю получать уже полученные сообщения, если id отдавать клиенту.
m4a1fox
Santehnick
Интереса ради. Коли уж вы опереруете таким понятием как redis, то почему при написании чата, выбор пал на такую банальную (уж простите) связку как php+ajax? Спрашиваю, дествительно ради интереса....
Santehnick
Цитата (m4a1fox @ 16.03.2013 - 15:48)
Santehnick
Интереса ради. Коли уж вы опереруете таким понятием как redis, то почему при написании чата, выбор пал на такую банальную (уж простите) связку как php+ajax? Спрашиваю, дествительно ради интереса....

Comet и подобное противоречит самому определению HTTP, технологии клиент-сервер smile.gif Так что будем придерживаться традиционной ориентации smile.gif Ну а вообще, я не единственный разработчик в команде и уровень знаний/умений у всех разный, но есть необходимый минимум, которым должен обладать каждый.
m4a1fox
Цитата (Santehnick @ 16.03.2013 - 16:33)
Цитата (m4a1fox @ 16.03.2013 - 15:48)
Santehnick
Интереса ради. Коли уж вы опереруете таким понятием как redis, то почему при написании чата, выбор пал на такую банальную (уж простите) связку как php+ajax? Спрашиваю, дествительно ради интереса....

Comet и подобное противоречит самому определению HTTP, технологии клиент-сервер smile.gif Так что будем придерживаться традиционной ориентации smile.gif Ну а вообще, я не единственный разработчик в команде и уровень знаний/умений у всех разный, но есть необходимый минимум, которым должен обладать каждый.

А причет тут Commet?
В частности я говорб про связку с nodeJS.....
Guest
В сессии сохранять состояние (id, ...) и ниуто не подменит )
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.