Как хранить информацию о новых личных сообщениях в чате?
Для "самообучения" решил написать чат используя PHP, MYSQL, JS, AJAX. В общем там имеются "диалоги", грубо говоря как Вконтакте. Сервер опрашивается ajax запросом.
На сервере в файле храню информацию о новых сообщениях. То есть при отправке сообщения и при его прочтении файл перезаписывается. Боюсьпри большом онлайне падения производительности и ошибок.
Думаю, можно увеличить число файлов, каждый под определенную группу. Или лучше каждый запрос подключаться к бд и искать новые сообщения там?
в задачу особо не вникал, сумбурно описано, нет типичности типа "Где хранить список юзеров онлайн?"
(Тем более при каждом сообщении он дважды перезаписывается).
вот БД перезаписываются (и читаются) не полностью, а лишь какая-то часть это нужно. то есть поддерживается seek() по файлу БД
Думаю, можно увеличить число файлов
в этом варианте сама файловая система превращается в БД (она и есть БД на этом уровне), соответственно скорость доступа к 500.000-му файлу из 1.000.000 повышается по сравнению если бы всего было в 1 файле без seek()
вообще, лучше сами экспериментируйте.
кучу юзеров онлайн можно создать ботом... причем простейшим.
мало мощности - купите VPS. или сервис для нагрузочного тестирования
Если речь именно о чате, то можно хранить в текущем файле лишь записи за актуальный промежуток времени, а остальные архивировать. Это предотвратит разрастание файла, к которому будет постоянно обращаться скрипт чата. Ессно, при записи файл нужно обязательно блокировать, чтобы исключить одновременного его изменения. Более того, вовсе не обязательно его переписывать полностью, можно добавлять новые записи в его конец - см. возможности file_put_contents().
То есть, на РНР вполне можно реализовать сносное решение. Но лучше всего, насколько я знаю, чаты себя показывают на Node.js
KorniloFF, при отправке в файл оповещение записывается если юзер онлайн, именно в конец. Но и удаляется тем же скриптом отправки, если это сообщение не читается за нужный промежуток времени. То есть там только актуальное. Файл блокируется.
Алексей Зайцев, К сожалению, при удалении нужно переписывать весь файл. Поэтому лучше сделать актуальный файл, в который идет только добавление, а потом уже по крону выкидывать из него ненужную информацию в архивные файлы.
Информацию о статусе юзеров я бы тоже писал в отдельном файле, поскольку обращения к нему будут реже, чем к файлу с контентом чата.
KorniloFF, спасибо. Подтолкнул на идею создать папку под каждого пользователя. И хранить там временные файлы. Например, статичные страницы переписок на определенные сессии. Файл со статусом и оповещение о новом сообщении. Думаю в верном направлении? Или там тоже подводные камни?
Подводные камни есть всегда, но направление верное с некоторым уточнением. Лучше иметь единый файл со статусами, думаю, сократит количество обращений к серверу.
А в папках хранить только личные данные, в т.ч. ЛС и что там еще будет (прикрепляемые файлы, etc.)
Архитектура, имхо, должна быть такая - запрос от клиента в индексный файл, проверка и вывод статусов зарегистрированных пользователей, вывод последних общих постов. Далее обновлять эту инфу по таймеру.
Как быстрее так и пишите, главное надо держать в уме, что если захотите перенести в БД или еще куда, то не надо было переписывать весь код, а только часть кода, которая отвечает за хранение данных.