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